Frage zu std::cerr
-
Hallo,
ich leite in meinem Programm denstd::cerrstream in einen eigenen Filestream um. Dabei speicher ich den alten streambuf von cerr und weise ihm cerr wieder im Destruktor zu.
Muss ich das überhaupt machen. Existiert cerr nur für mein Programm?
-
cerr wird normalerweise auf die Konsole umgeleitet, die die Ausgaben aber auch unabhängig von der Standard-Ausgabe verarbieten kann.
(z.B.prog > out.txt 2> err.txtleitet normale und Fehlerausgaben in zwei Dateien)Zu deiner Frage: Ob du das machen mußt, weiß ich nicht - die meisten Menschen machen es nicht und kommen auch gut so aus. Vielleicht solltest du mal erklären, warum du denkst, diese Umleitung nötig zu haben.
-
Nein, die Frage ist nicht, ob ich cerr umleiten muss, sondern ob ich cerr beim Schließen des Programms wieder seinen alten streambuf zuweisen muss.
-
Pikkolini schrieb:
Nein, die Frage ist nicht, ob ich cerr umleiten muss, sondern ob ich cerr beim Schließen des Programms wieder seinen alten streambuf zuweisen muss.
Nein, musst du nicht.
-
Pikkolini schrieb:
Nein, die Frage ist nicht, ob ich cerr umleiten muss,
Die Frage ist eher, warum du cerr umleiten solltest?
-
Zuerst einmal gibt es -nunja - 2 Arten von Umleitungen. Die erste Umleitung wird von der Konsole durchgeführt und ist unabhängig davon wie das Programm das selber nacht.
Die zweite Art der Umleitung ist die innerhalb des Programms selber. Es gibt das globale Objekt
std::cerr, das im Normalfall alles an den Fehlerkanal ausgibt. Dieses globale Objekt kann ich aber 'verbiegen' so dass es die Ausgabe zu einem von mir selber definierten Kanal weiter gibt (z.B. eine eigene Datei). Da das rein Programmintern funktioniert kann man das auch nach Programmende schmutzig hinterlassen.Aber: Das Objekt auf das
std::cerrwird zerstört und die Umleitung wird nicht berichtigt => Gibt man dann etwas auf std::err aus, so laufen diese Daten in ein bereits zuerstörtes Objekt (bumm). Es ist also immer besser aufzuräumen. Es kann zwar sein dass das jetzt nicht passiert, aber der Code wird weiterentwickelt und irgendwann geschieht das doch in irgendwelchen Ausnahmefällen - da sucht man sich nach so einem Fehler die Augen wund.
-
Selbst wenn du nichts mehr nach cerr ausgeben willst, versucht der Stream auf jeden Fall irgendwann während der Endsequenz, seinen Puffer wieder freizugeben. Und das bedeutet dann womöglich, daß dein Programm sich auf die harte Tour beendet (SegFault o.ä.).