Speichalloziirung in Kon-Destruktoffunktionen

MetallDragon

Erfahrenes Mitglied
Speichalloziirung in Kon-und Destruktoffunktionen

Ich denke, dass der Titel schon ungefär aussagt, was ich will:
Schaut euch mal bitte folgenden Code an:
Code:
class CMyClass { 

//Konstruktor
CMyClass(){
int *i = new int; //oder eine beliebige andere alloziirung von Speicher
}
//Destruktor
~CMyClass(){
delete i;
}
 
int main(){
CMyClass *test = new MyClass();
delte test;
return 1;
}

Meine Frage : Kann hier ein Speicherleck entstehen, wenn test gelöscht wird? bzw wie kann ich das überprüfen.
Ich hoffe, dass ich meine Frage verständlich formuliert habe.

Danke für eure Zeit
 
Zuletzt bearbeitet:
MetallDragon hat gesagt.:
Meine Frage : Kann hier ein Speicherleck entstehen, wenn test gelöscht wird? bzw wie kann ich das überprüfen.
Ich hoffe, dass ich meine Frage verständlich formuliert habe.

Danke für eure Zeit

Nein der Code is einwandfrei.
Der delete Aufruf erfüllt im wesentlichen zwei Funktionen:
1.) Den Destruktor aufrufen
2.) Den mit new auf dem Heap alloziierten Speicher wieder freigeben

=> Der Destruktor wird aufgerufen(in deinem Fall) und das im Konstruktor allzoiierte Objekt (i)
wird wieder freigegeben. Nach verlassen des Destruktors wird der Speicherplatz des
Objektes test auch wieder freigegeben und alles ist perfekt ;)

Wenn du dich um sowas nicht kümmern möchtest lass es dir von C++ automatisch machen
und erzeuge die Objekt auf dem Stack, somit werden die Objekte nach verlassen des
Blocks in dem sie deklariert wurden automatisch wieder destruiert und du ersparst dir
das manuelle Löschen via delete und verhinderst vielleicht die von dir gefürchteten
Speicherlecks....

Gruß

RedWing
 
P.S.
Wenn du dich um sowas nicht kümmern möchtest lass es dir von C++ automatisch machen
und erzeuge die Objekt auf dem Stack

Falls du soetwas vor hast, was wie ich finde den Pointern vorzuziehen wäre, wenn man
sie nicht unbedingt brauch,
dann denke dran diese Objekte immer (wo möglich) per call by reference zu übergeben,
da dann nur die Referenz übergeben wird und nicht jedesmal der Wert bzw das gesamt
Objekt umkopiert werden muss..

Gruß

RedWing
 
Nein der Code is einwandfrei. IRRTUM !
Der sollte nicht mal kompilierbar sein!
Denn i ist ein "lokaler" pointer der nur im Konstruktor gilt (und somit niemals zerstört wird)
Im Destruktor sollte es einen Kompilerfehler geben, da i unbekannt ist.
Das gilt natürlich nur für das Codebeispiel.

Der Rest von RedWing ist natürlich korrekt.

Daniel
 
Nein der Code is einwandfrei. IRRTUM !
Der sollte nicht mal kompilierbar sein!
Denn i ist ein "lokaler" pointer der nur im Konstruktor gilt (und somit niemals zerstört wird)
Im Destruktor sollte es einen Kompilerfehler geben, da i unbekannt ist.

Upsala das is mir nicht aufgefallen:-(
Sollte aber beim vorhandensein eines Compilers kein Problem sein
Man sollte noch eine Online Syntax und Semantiküberprüfung in die Codetags einbauen ;)

Gruß

RedWing
 
Zuletzt bearbeitet:
Man sollte noch eine Online Syntax und Semantiküberprüfung in die Codetags einbauen
Ja das wäre nicht schlecht, aber besser wäre noch ein GCC-Backen im Forum, dann könnte man immer gleich die Fehler sehen. Denn den Fehler sieht man mit dem besten Highlighting nicht :) :) :) :)

Daniel
 
Die alloziirung von i war nur ein Platzhalter.
(Wieder 'ne Entschuldigung gefunden ;) )
In der Anwendung sind die Zeiger Membervariablen einer Klasse. Also keine lokalen Variablen.
Ich muss in diesem Fall leider auf die dynamische alloziirung zurückgreifen, da ich Memebervariablen erzeugen muss, die Parameter aus dem Konstruktor der Klasse verwenden.
Sonst würde ich die Variablen auch auf dem Stack erzeugen.
Btw: Gibt's eigendlich einen hardwaretechnischen unterschied zwischen Stack und Heap ?
Vermutung: der Stack liegt im RAM und der Heap im CPU-Cache. Stimmt das ?

Naja auf jeden Fall habt ihr mich jetzt schon mal beruhigt.
Danke
M.D
 
Daniel Toplak hat gesagt.:
Ja das wäre nicht schlecht, aber besser wäre noch ein GCC-Backen im Forum, dann könnte man immer gleich die Fehler sehen. Denn den Fehler sieht man mit dem besten Highlighting nicht :) :) :) :)

Daniel

Mit Syntax und Semantiküberprüfung meint ich auch eigentlich kein einfaches Highlighting :rolleyes: ;)
Btw: Gibt's eigendlich einen hardwaretechnischen unterschied zwischen Stack und Heap ?
Vermutung: der Stack liegt im RAM und der Heap im CPU-Cache. Stimmt das ?

Mhm kA intressiert mich als Programmierer eigentlich auch nicht.
Das einzigste was ich dir sagen kann, ist das Heap, sowas wie Halde heißt.
Diese Halde stellt dir Speicher zur Verfügung und du kannst daraus bei
Bedarf was entnehmen.
Und ein Stack ist ein Stapelspeicher der von unten nach oben aufgebaut wird,
und von oben nach unten wieder abgebaut wird.
Wenns dich genauer intressiert:
http://de.wikipedia.org/wiki/Heap_(Speicher)
http://de.wikipedia.org/wiki/Stack

Gruß

RedWing
 
Also beide werden im RAM bzw. virtuellen RAM (Auslagerung/SWAP) angelegt.
Der CPU-Cache dient nur dem CPU, als "kurzfristiger" Auslagerungsspeicher, um werte zu Cachen bzw. Zwischenzuspeichern, da die Auslagerung in den physikalischen RAM "zu langsam" ist.

Daniel
 
Hi,

Zu beachten ist auch, dass der Stack nur eine begrenzte Größe hat. Wärend der Heap hingegen (theoretisch) nur vom freien RAM bzw Auslagerungsspeicher begrenzt ist.


schau mal hier.

Mfg Col.Blake

PS: Ist aber für kleine Anwendungen sicher nicht relevant.
 
Zurück