Es gibt auch viele Leute, die meine, in einem guten C++ Programm sollte so gut wie keine delete auftauchen:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//C
void doStuff()
{
FILE *File=NULL;
File=fopen("bla");
///Datei operationen:
fclose(File);
//other Stuff
}
//C++
void doStuff()
{
fstream File("bla");
File<< Data;
//kein File.close()
//other Stuff
}
|
Der Destruktor des Filestreams schließt die Datei automatisch, sobald sie nicht mehr benutzt wird (der Scope (also doStuff()) verlassen wird). Ein fclose kann man vergessen, einen Destruktoraufruf nicht. Natürlich kann man jetzt sagen, ein expliziter File.close()
Aufruf wäre schöner, und er würde auch funktionieren und das erwartete tun, aber ratsam ist er trotzdem nicht: Es wäre möglich, dass am Ende nocheinmal etwas mit der Datei gemacht werden soll. Vielleicht hat man die Aufruf vergessen und versuch jetzt in eine geshclossene Datei zu schreiben. Viel schöner ist es, Objekte möglichst lokal zu halten, in etwa so:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
void doStuff()
{
{//file operation
fstream File("bla");
File<< Data;
//kein File.close()
}
//other Stuff
}
|
Die Datei wird so direkt nach dem Schreiben geschlossen und wenn man später versucht, auf das Objekt zuzugreifen, merkt das schon der Compiler - und Compilerfehler sind IMMER(!!) besser als Laufzeitfehler. Und dadurch, dass die Datei bereits im Konstruktor geöffnet wird, ist sie über ihren gesamten Lebenszeitraum hinweg gültig, was ein sehr großer Vorteil ist. Siehe dazu auch:
http://en.wikipedia.org/wiki/Resource_Ac…_Initialization
(oder die kurze, aber duetsche Version:
http://de.wikipedia.org/wiki/Ressourcenb…Initialisierung)
Das selbe funktioniert so ziemlich mit allen Ressourcen in C++. Statt Arrays gibt es std::vector, oder eben ein anderer Container, je nach Anwendung. Für einzelne Objekte am Heap gibt es eine ganze Reihe verschiedener Smartpointer, zum Beispiel von boost oder im neuen C++ Standard (und davor in std::tr1, meine ich).
Also: Lass den Compiler deine Ressourcen verwalten (und überlege immer, ob du nicht ein close oder delete vermeiden kannst, durch Einsatz anderer Klassen). Es ist gut und wichtig, zu wissen was im Hintergrund geschieht, aber man sollte ruhig auf einer höheren Ebene Programmieren.