2010-11-18 13 views
1

Ich habe ein sehr irritierendes Problem beim Ausführen einer C++ - Anwendung. Ich verwende den pgcpp-Compiler auf dem Interix-Subsystem von Windows XP. Mein Problem ist im Wesentlichen hier beschrieben:C++ - Anwendung stürzt beim Instanziieren eines Ofstream-Objekts ab.

Ich habe eine Klassendefinition in einer Header-Datei. Diese Header-Datei ist in einer Quelldatei enthalten. Diese Klasse hat zwei Konstruktoren und wird im Grunde verwendet, um einen Logger zu implementieren. Der erste Konstruktor verwendet ostream * als Argument, während der zweite überladene Konstruktor einen Dateinamen und einen booleschen Standardwert false verwendet. Das Ziel dieses zweiten Konstruktors besteht darin, einen Stream für den übergebenen Dateinamen zu erhalten und mit der Protokollierung von Nachrichten zu beginnen. Der Code in der Konstrukteurs ist wie folgt:

MessageLogger::MessageLogger(std::ostream *out): p_out (out), p_ofstream (0) 
{ 
    if (p_out) 
    { 
     (*p_out) << "Started logging messages" << endl; 
    } 
} 

MessageLogger::MessageLogger (char const *filename, bool append_to_file) : p_out (0), p_ofstream (0) 
{ 
    if (append_to_file) 
    { 
    p_ofstream = new std::ofstream (filename, ios::app); 
    } 
    else 
    { 
     p_ofstream = new std::ofstream (filename); 
    } 

    p_out = p_ofstream; 

    if (p_out) 
    { 
     (*p_out) << "Started logging messages" << endl; 
    } 
} 

Wo die Erklärungen von p_out und p_ofstream sind wie folgt:

std::ostream *p_out; 
std::ofstream *p_ofstream; 
unsigned int p_indent_level; 

die alle drei oben genannten sind private Mitglieder. Die Instanziierung der Klasse Message erfolgt wie:

MessageLogger logger ("filename"); 

Bitte beachten Sie, dass append_to_file einen Standardwert false hat. PGDBG ist auch schlecht benehmend. Ich bin unerklärlich in der Lage zu treten, wenn das Steuerelement bei p_ofstream = new std::ofstream (filename); ist und es in einen zufälligen Speicherort tritt, und dann stürzt die Anwendung ab.

Auch wenn ich versuche, entweder gemischten oder Zerlegen Code in PGDBG, der Debugger stürzt ab mit der Meldung zu sehen:

jpgdbg parse: Newline must follow cmd in 'eleq "0" struct MessageLogger *Mes 
sageLogger::MessageLogger(struct basic_ostream *out); (TranslatorGeneric.cpp 
) 
' 
jpgdbg jpgdbgFileSelector processMsg: Warning unexpected msg token 5 
jpgdbg parse: Newline must follow cmd in 'eleq "1" struct MessageLogger *Mes 
sageLogger::MessageLogger(char *filename, unsigned char append_to_file); (Tr 
anslatorGeneric.cpp) 
' 
jpgdbg jpgdbgFileSelector processMsg: Warning unexpected msg token 5 

Ich bin nicht in der Lage dies in einem Beispielprogramm zu reproduzieren, wo ich genau das gleiche tat Ding wie oben aber alles funktioniert gut. Kann jemand bitte erklären, was passiert und ob es eine Lösung gibt?

Danke, Aditya.

+0

In Ihrem Code hat 'append_to_file' keinen Standardwert. –

+0

Ist Ihre Frage zur Anwendung oder zum Debugger? In beiden Fällen: Was genau fragen Sie? –

+0

Die Frage bezieht sich auf die Anwendung, die fehlschlägt. Der Debugger ist nur ein zusätzliches Problem, das ich habe, das ich teilen sollte. Die Datei append_to_file wird auf false gesetzt. Es tut mir leid, dass ich den gesamten Code nicht gezeigt habe. – Aditya

Antwort

0

Warum verwenden Sie eine dynamisch zugeordnete Instanz von ofstream? Warum gehst du nicht etwas tun, wie folgt aus ...

class Logger 
{ 
    public: 
    Logger(ostream& str) : _str(str.rdbuf()) // use the buffer from the stream 
    { 
     _str << "writing to passed in buffer" << endl; 
    } 
    Logger(const char* fname, bool append = false) : _str(cout.rdbuf()) 
    { 
     _file.open(fname, (append)? ios::out|ios::app : ios::out); 
     if (_file.is_open()) 
     _str.rdbuf(&_file); // redirects to file, else remains on cout 

     _str << "expected to be logging to: " << fname << endl; 
    } 

    // use as needed 

    private: 
    filebuf _file; 
    ostream _str; 
}; 

Auf diese Weise, auch wenn die Dateien fehlschlägt, werden Sie noch in der Log-Ausgabe gehen cout haben ...

Zurück zu Ihrem Problem Was macht HW_NEW? Mit den von Ihnen bereitgestellten grundlegenden Informationen ist es schwer zu sagen ...

+0

Dies ist Teil einer großen Anwendung, die ich versuche, auf Windows zu migrieren. Also habe ich wirklich keine Kontrolle oder eine Entscheidung, wie ich das machen soll. Ich habe meine Frage bearbeitet, um die Dinge etwas klarer zu machen. Vielen Dank für die Antwort. Kannst du es dir jetzt ansehen und mir sagen, warum das scheitert? Der Beispielcode, über den ich gesprochen habe, wurde ebenfalls mit pgcpp kompiliert, und daher glaube ich nicht, dass dies ein Compiler-Problem ist. Wenn ich nicht falsch liege? – Aditya

+0

in Ordnung, zum Anfang zurückgehen, haben Sie gebaut alle Objekte/Bibliotheken richtig (das heißt sie sind alle die richtigen Header mit etc.)? Sie können zufällige Abstürze haben, wenn es Objekte mit unterschiedlichen Versionen der gleichen Header-Datei usw. Als ersten Schritt zusammengestellt sind, würde ich sauber und alles neu zu kompilieren. Sobald dies erledigt ist, bestätigen Sie, dass dies der Fall ist, wo der Absturz stattfindet (mit einem Debug-fähigen Build). Dann versuchen Sie es im Debugger, sollte der Code oben in Ordnung sein, und es könnte zusammen beiläufig sein, dass der Absturz dort passiert ... – Nim

+0

Ich hatte einen Kollegen diese ganze Anwendung erstellen. Das Gleiche passiert mit ihr. Wir haben einen neuen Build gemacht. Können Sie mir sagen, wenn Sie einige C++/Compiler-bezogene Fehler sehen, die passieren könnten? Oder ist das einfach etwas, das in der Mitte kaputt gegangen ist - wenn so etwas möglich ist. – Aditya

Verwandte Themen