2009-05-12 1 views
0

Ich glaube, ich verstehe etwas feiner C++ nicht. Ich möchte ein Protokoll darüber erstellen, was mein Programm macht, und habe std::clog entdeckt, was theoretisch zu tun scheint, was ich will, aber in der Praxis tut es das nicht.Warum wechselt mein Clog Stick nicht?

Wenn ich den folgenden Code, Clog funktioniert wie erwartet und schreibt „Test 1“ auf dem Bildschirm, und „Test 2“ zeigt in einer Datei auf:

int main() 
{ 
    clog << "Test 1" << endl; 
    streambuf* original_buffer = clog.rdbuf (ofstream ("test.log").rdbuf())); 
    clog << "test 2" << endl; 

    clog.rdbuf (original_buffer); 
    return 0; 
} 

Aber wenn ich setzen, dass alle in ein Klasse als solche, dann „Test 1“ auf den Bildschirm geschrieben wird, wird test.log erstellt, aber es gibt nichts im Innern und „Test 2“ nicht, wo gefunden werden !:

class IerrLog 
{ 
    std::streambuf * original_buffer; 
    public: 
    IerrLog() 
    { 
     std::ofstream logFile ("test.log"); 
     original_buffer = std::clog.rdbuf (logFile.rdbuf()); 
    } 
    ~IerrLog() 
    { 
     std::clog.rdbuf (original_buffer); 
    } 
}; 

int main() { 
    clog << "Test 1" << endl; 
    IerrLog someLog(); 
    clog << "Test 2" << endl; 
    return 0; 
} 

Was bin ich?

EDIT: Wenn ich das letztere in valgrind laufen lasse, erhalte ich Fehler wie diese (die früheren Läufe sauber):

Invalid read of size 8 
    at 0x39598993E5: std::ostream::flush() (in /usr/lib/libstdc++.so.6.0.10) 
    by 0x395989B5F2: std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) (in /usr/lib/libstdc++.so.6.0.10) 
    by 0x400F8E: main (main.cc:23) 
    Address 0x7ff0006c8 is just below the stack ptr. To suppress, use: --workaround-gcc296-bugs=yes 

Ich bin nicht so widerlich zu denken, dass ich (ein bescheidener gemeinsamen Programmierer) gefunden Ein Compiler-Bug mit solch einem einfachen Programm, aber das macht mich noch verwirrter und Valgrind findet offensichtlich, dass letzteres irgendwie falsch ist, obwohl ich versuchte, sie funktional identisch zu machen.

Antwort

4

Ich nehme an, Sie möchten eine Stapelvariable von IerrLog erstellen. Sie müssen

IerrLog someLog(); 

zu

IerrLog someLog; 

Ihre ursprüngliche Aussage ändern wird vom Compiler als eine Erklärung der Funktion someLog(), die keine Argumente übernimmt und gibt eine IerrLog interpretiert werden.

Sie sollten auch Ihre Datei als eine Mitgliedsvariable und nicht auf dem Stapel erstellen.

+0

Wow, das war schnell. 'logFile' auf dem Stapel war in der Tat das Problem! – MighMoS

+0

Nicht ganz - die erste Zeile dort wird als Deklaration der Funktion someLog() interpretiert, die keine Argumente annimmt und ein IerrLLog zurückgibt. –

+0

@Draw du hast Recht, ich werde die Antwort beheben. – lothar