| 

.NET C# Java Javascript Exception

4
hi,
muss ich in C++ objekte meiner eigenen klassen, die ich als lokale variablen angelegt hab, mit delete freigeben oder nicht?

MeinObject mo("abc");
...
delete &mo; //hier löschen oder nicht...

Wir der speicher automatisch freigegeben?
28.08.2009
winmain 123 1 3
winmain 123 1 3
5 Antworten
7
Wenn du die Variablen nur auf dem Stack erzeugst, brauchst du die nicht freigegeben. Sobald der Geltungsbereich verlassen wird, wird automatisch der Destruktor aufgerufen.
Nur wenn du Variablen mit "new" auf dem Heap anlegst, musst du den Speicher mit delete freigeben.
30.08.2009
Shelling 356 1 3
2
Ich möchte noch hinzufügen, dass "nicht zu brauchen" hier zu schwach ist. Man darf delete nicht mit der Adresse eines Stack-Objekts aufrufen. Wenn's nicht direkt kracht, weil z.B. der Destruktor zweimal aufgerufen wird, gibt's zumindest undefiniertes Verhalten.
andre 07.09.2009
1
Danke für die Ergänzung :)
Ich hoffe es gab wegen meiner Wortwahl keine Missverständnisse
Shelling 08.09.2009
4
Es ist komplett falsch den delete in dem Fall aufzurufen! Als Ergänzung:

  • MeinObject mo("abc");
    auf dem Stack alloziert NIE delete aufrufen (der Destruktor kümmert sich darum)

  • MeinObject* mo = new MeinObject("abc");
    auf dem Heap alloziert -> mit
    delete mo;
    freigeben (nicht Ausnahmesicher! Lieber std::auto_ptr verwenden)

  • MeinObject* mo = new MeinObject[10];
    array auf dem Heap -> mit
    delete [] mo;
    freigeben ohne eckige Klammern wird sonst nur den Destruktor fürs erste Object aufgerufen was ein Speicherleck hervorrufen könnte!
07.09.2009
jdehaan 434 2 7
jdehaan 434 2 7
3
Ich möchte noch etwas klugscheissen:

MeinObject mo("abc");

wird nicht immer notwendigerweise auf dem Stack alloziert, es kann sich auch
um eine globale Variable handeln. Trotzdem muss sie dann nicht
(bzw. darf nicht) mit delete gelöscht werden.
07.09.2009
stealth 61 1 1
0
Schau dir mal Destructors an. Da wird deine Frage (und eventuell weitere) beantwortet.
28.08.2009
gfoidl 9,4k 3 5
-1
Nein, auf keinen Fall. Das könnte zu Exceptions führen.

delete hat zwei Aspekte
a) Aufruf des Destruktors
b) Freigabe des Speicherplatzes

Die Frage ist nicht ganz eindeutig gestellt.

Handelt es sich um eine Variable die ausserhalb einer Methode oder Funktion angelegt wird,
dann ist es eine globale, eventuell eine Modulglobale (static) Variable.
Der Destruktor wird dann nach dem exit () / Verlassen des main () aufgerufen.
Die Reihenfolge ist undefiniert
Der Speicherplatz muß nicht freigegeben werden, das macht das Runtimesystem selbst

Befindet sich die Variable innerhalb einer Methode oder Funktion, dann heißt sie automatische Variable und wird auf dem Stack abgelegt.
Der Destruktor wird beim dem Verlassen des aktuellen Blocks (das sind die { }) aufgerufen.
Die Reihenfolge entspricht der Anlage
Auch hier braucht man kein delete aufrufen.
08.09.2009
stefan.bachert 395 4

Stelle deine Html-Frage jetzt!