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.
Wow, das war schnell. 'logFile' auf dem Stapel war in der Tat das Problem! – MighMoS
Nicht ganz - die erste Zeile dort wird als Deklaration der Funktion someLog() interpretiert, die keine Argumente annimmt und ein IerrLLog zurückgibt. –
@Draw du hast Recht, ich werde die Antwort beheben. – lothar