Frage zu Heap und Stack
-
Hallo zusammen,
ich beschäftige mir momentan mit dem Stack und mit dem Heap. Ich habe gelernt, dass der Stack der automatisch verwaltete Speicher ist
und der Heap der manuell verwaltete.Wenn ich eine Instanz instanziiere, dann kann ich dies mit einem Pointer machen oder auch nicht. Einmal liegt meine Instanz auf
dem Heap und einmal auf dem Stack, d.h. ich muss mich einmal nicht selber um das Löschen des Objektes kümmern:Klasse *Objekt; Objekt->TuWas(); //auf dem Heap delete Objekt; //------------------------------- Klasse Objeckt; Objekt.TuWas8); //auf dem Stack
Bei Objekten auf dem Heap benötige ich den Pfeiloperator, um Mehtode mit Obkekt zu verbinden. Bei Objekten auf dem Stack brauche
ich den Punktoperator.Ist es nun besser, Objekte auf den Stack oder auf den Heap zu legen (immerhin muss ich mich dann nicht, um das Löschen kümmern und es kann kein Speichermüll enstehen)?
Wie kann ich eine Variabel auf den Heap legen, denn wenn ich schreibe "int zahl;", dann wird diese doch auf den Stack gelegt, oder?Vielen Dank für eure Hilfe
lg, freakC++
-
freakC++ schrieb:
Bei Objekten auf dem Heap benötige ich den Pfeiloperator, um Mehtode mit Obkekt zu verbinden. Bei Objekten auf dem Stack brauche
ich den Punktoperator.Das stimmt so nicht. Beispiel:
Klasse Objekt; //auf'm Stack Klasse *p=&Objekt; p->TuWas(); //Pfeil trotz Stack! ;)
Der Pfeil-Operator gibt dir einfach Zugriff auf ein Objekt, auf das der Pointer zeigt (er dereferenziert also vorher). Das hat nix mit Stack oder Heap zu tun.
freakC++ schrieb:
Ist es nun besser, Objekte auf den Stack oder auf den Heap zu legen (immerhin muss ich mich dann nicht, um das Löschen kümmern und es kann kein Speichermüll enstehen)?
Manchmal hast du gar keine Wahl. Wenn du ein dynamisches Array brauchst, musst du es auf dem Heap ablegen. Der Stack ist auch in seiner Größe begrenzt, also sind manchmal auch Arrays, deren Größe du zur Compile-Zeit kennst, nicht für den Stack geeignet. Ich würde einfach mal sagen: wo es geht, nimm den Stack.
EDIT: Und 'Speichermüll' entsteht normalerweise auch nicht, sofern man für jedes new/malloc auch direkt das entsprechende delete/free notiert. Das sollte man sich angewöhnen und sich selbst mit kleinen bis mittleren Stromschlägen bestrafen, wenn man sich nicht dran hält.
freakC++ schrieb:
Wie kann ich eine Variabel auf den Heap legen, denn wenn ich schreibe "int zahl;", dann wird diese doch auf den Stack gelegt, oder?
Mit new oder malloc.
-
Hallo
Ist es nun besser, Objekte auf den Stack oder auf den Heap zu legen (immerhin muss ich mich dann nicht, um das Löschen kümmern und es kann kein Speichermüll enstehen)?
Kommt drauf an was du mit dem Objekt machen willst. Beide Seiten haben ihre Vor- und Nachteile.
Stack ist schnell und bereingt sich automatisch, aber auch klein und unflexibel was die Gültigkeit angeht.
Heap ist groß und flexibel, aber langsam und erfordert manuelles Aufräumen.
(schnell/langsam ist natürlich relativ)Wie kann ich eine Variabel auf den Heap legen, denn wenn ich schreibe "int zahl;", dann wird diese doch auf den Stack gelegt, oder?
Da unterscheiden sich PODs (Plain Old Datatype) wie int nicht von UDTs (User Definied Type) wie TForm nicht :
int* x = new int(5); delete x;
bis bald
akari