Nein, sollte er nicht. Es ist schlicht Auffassungssache.danlei schriebAussehen sollte er so:with_open_file(i, "dateiname") { while (getline(i, line)) { cout << line << endl; } }
Jedes automatisch erzeugte Objekt (d.h. eins, das nicht mit new auf dem heap erzeugt wurde, sondern lokal auf dem stack) lebt bis zum Ende des Blockes, in dem es erzeugt wurde. So ist die Regel. Bereits am Blockanfang wird Platz auf dem Stack reserviert, und zwar für alle Variablen des Blockes in Summe. Irgendwann später (nämlich wenn die Zeile kommt, vor der noch etliches andere stehen kann) wird der Konstruktor aufgerufen, der das Objekt auf dem stack initialisiert. Ab dann lebt das Objekt (der Compiler verhindert vorherige Zugriffe, indem er den Namen des Objekts für unbekannt hält), bis irgendwann der Block zu Ende ist. Dann werden alle Destruktoren aufgerufen, die zu stack-Objekten dieses Blocks gehören, und zwar in umgekehrter Reihenfolge. Nach deren Ende wird der Platz auf dem Stack freigegeben.danlei schriebEin kleines Verständnisproblem habe ich: Woher weiß der Stream, wann er geschossen werden soll? (Keine rhetorische Frage, sondern eine ernst gemeinte.)
Dieses wichtige und ebenso einfache wie wirkungsvolle Prinzip ist anfänglich selbst vielen C++-Programmierern nicht klar. Statt dessen findet man alberne lokale Konstruktionen mit smart pointers und dynamisch erzeugten Objekten, weil in der Vorlesung gesagt wurde, daß das gut sei, die dann noch falsch angewendet werden, um am Ende über die schwierige und ohnehin pöse Speicherverwaltung herzuziehen.
Dabei kann man mit diesem Prinzip nicht nur superschnell Objekte erzeugen, nämlich ohne Speicher allokieren zu müssen, sondern auch ihre Lebensdauer explizit bestimmen, d.h. steuern, indem man einfach den Block genau so groß macht, wie er sein soll.
Man kann übrigens das Schließen eines streams auch explizit veranlassen. Die stream-Klassen haben eine close-Methode. Dies ist nützlich, wenn man den stream später wieder öffnen will. Meist überläßt man das Schließen allerdings dem Destruktor.