delete
-
Wenn ich Variablen, also keine Zeiger anlege, z.B.
int a;
Kann ich diese dann auch mit
delete a;
löschen?
Bzw. ist das nötig um den Speicherplatz wieder freizugeben?
Und wenn man Variablen in Funktionen anlegt, werden diese am Ende der Funktion dann selbstständig gelöscht?Danke.
-
Nein, nein, ja.
-
- EDIT: zu spät -
-
wenn du sowas machst wie dus beschrieben hast, wird dein Programm ziemlich sicher mit einer Zugriffsverletzung abstürzen.
Beispiel:
int a = 10; delete a;Was bei der Auführung passiert, ist, dass versucht wird den Speicherblock, der an der Speicheradresse 10 liegt zu löschen. Da dies aber außerhalb des Speichers deines Prozesses liegt wird das das Betriebssystem nicht gut finden und das Programm beenden.
Das andere hat was mit der Gültigkeit und der Lebensdauer von Variablen zu tun. Variablen existieren immer innerhalb des Blocks in dem sie definiert werden
int a = 10; //man kann Blöcke immer und überall definieren { int b = 10; } a = b; // -> CompilerfehlerDas gleiche gilt für Funktionen, da diese auch einen Block öffnen und wieder schließen { }.
Variablen die explizit erzeugt werden (z.B. durch int, float, char...) dienen dem Compiler lediglich als Information dafür, dass er ergindwo Speicher (meist auf dem Stack) reservieren soll. Es sind also Platzhalter. Wird der Gültigkeitsbereich der Variablen verlassen, dann wird auch der Speicher wieder freigegeben.
Anders sieht es in diesem Fall aus:
int* function getAnInt() { return new int; } int *pointerToInt = getAnInt(); ... delete( pointerToInt );Hier muss man die Variable wieder freigeben, da der Compiler nur die Referenz (Pointervariable), nicht aber das worauf diese zeigt kennt. Gib man pointerToInt nicht wieder frei entsteht ein Memoryleak.
-
Also muss man dann auch Klassenvariablen nicht wieder freigeben,
sonder nur Zeiger?
-
Die Antwort ist ganz simple:
Alles was Du mit new angelegt hast, mußt du mit delete wieder freigeben.
-
littlejohn schrieb:
wenn du sowas machst wie dus beschrieben hast, wird dein Programm ziemlich sicher mit einer Zugriffsverletzung abstürzen.
Beispiel:
int a = 10; delete a;Was bei der Auführung passiert, ist, dass versucht wird den Speicherblock, der an der Speicheradresse 10 liegt zu löschen. Da dies aber außerhalb des Speichers deines Prozesses liegt wird das das Betriebssystem nicht gut finden und das Programm beenden.
Das wird ziemlich sicher nicht passieren, da der Compiler so ein Programm gar nicht kompilieren dürfte. Der Comeau zum Beispiel sagt:error: expression must have pointer typeUm den von dir gewünschten Effekt zu bekommen müsste man schon etwas härter rangehen, z.B. so:
int main() { int a = 10; delete reinterpret_cast<int*>(a); }Aber da so verrückt ja hoffentlich niemand ist, erübrigt sich das Problem.
Die Antwort auf die Frage
Der Franz schrieb:
Wenn ich Variablen, also keine Zeiger anlege, z.B.
int a;
Kann ich diese dann auch mit
delete a;
löschen?ist also nein. Man kann Variablen so nichtmal löschen.
Felix :xmas2:
-
Und STL-Container?
Kann man einfach schreibenstd::vector<Klasse1> K1;
und der Speicher wird wieder freigegeben am Ende des Programms?
-
Ja.
Wurde ja schon geschrieben: alles was mit new angelegt wird muss mit delete geloescht werden. Sollte doch so relativ schon das Ende der Geschichte sein, nee?
std::vector hat (wie jede Klasse) einen destructor, der sich um das deleten des Speichers selbst kuemmert.
-
Shinja schrieb:
std::vector hat (wie jede Klasse) einen destructor, der sich um das deleten des Speichers selbst kuemmert.
Das betrifft aber nur Ressourcen, die innerhalb der Klasse verwendet werden. Das Löschen der Instanz selbst ist immer noch Teil der Implementation. Oder anders formuliert, das ist die Aufgabe des Compilers und sein Umgang mit automatischem Speicher.
-
Hmm,. ja tschuldigung falsch formuliert. Eigentlich habe ich das array gemeint, das std::vector ja wohl verwendet. Waere aber net so ganz die Antwort auf die Frage gewesen, sry.