Warum Speicher mit new reservieren?
-
Optimizer schrieb:
Wenn ich nicht will, dass etwas tot ist sobald der Stackframe abgebaut wird, kann ich es halt nicht auf dem Stack anlegen. Man muss sich Gedanken über die Lebenszeit des Objekts machen.
exakt
mit new erzeuge ich Objekte mit dynamischer Lebensdauer, d.h. die Lebensdauer hängt nicht von der statischen Blockstruktur des Programms ab, sondern von den Zeitpunkten, zu denen sich der Programmierer entschließt, das Objekt zu erzeugen bzw. zu zerstören.
Weitere Aspekte dieser Dynamik: Man kann den Typ zur Laufzeit festlegen (siehe Factory-Muster), bei Arrays die Größe.
-
Artchi schrieb:
Ich will ja nichts sagen, aber du weißt es einfach selbst nicht.
Wer etwas nicht erklären kann, hat es selber nicht verstanden. Finde es armsehlig sich jetzt rausreden zu wollen. Gib doch einfach zu "Ich weiß es auch nicht.". Wenn es im Detail nicht stimmt, ist es nicht so schlimm, dann kann man es korrigieren. Aber garnicht erklären, das einem die Worte fehlen???
Hier sind soviel schöne Erklärungen die ich ihm auch schon erklärt habe, aber trotz der vielen Threads hier versteht er es immer noch nicht so richtig, hat nichts damit zu tun, das ich es selber nicht weiß sondern das er es nicht nicht versteht. Und deshalb fehlten mir die Worte, weil ich einfach nihct merh wusste wie ich es ihm verständlicher erklären soll.
-
Nicht jeder ist zum Programmierer berufen...
Wenn er es nicht kapiert, ist er evtl. einfach
ungeeignet für die Aufgabe
-
Oder Assembler lernen, dann weiß man, warum es da Unterschiede gibt.
-
vielleicht hilft folgendes (für pragamatiker)
http://turing.fh-landshut.de/~jamann/Der Unterschied zwischen Stack und Heap.pdf
-
Was gibts da großartig nicht zu verstehen
1. Der Stack ist beschränkt in seiner Größe, große Objekte müssen auf den Heap.
2. Der Stack baut sich bei Scope-Ende wieder ab, wenn du Objekte über Scope-Grenzen hinaus benützen willst benötigst du den Heap
3. Nur mit dynamischen Speicher kannst du dynamisch Objekte anlegen und so tolle Dinge wie Polymorphie benützenMfG SideWinder
-
SideWinder schrieb:
3. Nur mit dynamischen Speicher kannst du dynamisch Objekte anlegen und so tolle Dinge wie Polymorphie benützen
Nein, Polymorphie hat damit nichts zu tun.
-
Direkt nicht, aber indirekt muss man auf Heap-Speicher zurückgreifen. Kenne zumindest selbst keine Möglichkeit mit Stack-Objekten Polymorphie zu betreiben.
// afaik nicht möglich: Base base = Derived();
MfG SideWinder
-
Zum Beispiel geht sowas:
void foo(Base& base) { base.methode(); }
Wo das Objekt jetzt liegt, ist egal.
-
Derived a; Base *b = &a;
Für Polymorphie braucht man nur virtuelle Funktionen und die Möglichkeit, Basisklassenzeiger (oder -referenzen) auf abgeleitete Objekte zeigen zu lassen.
-
SideWinder schrieb:
3. Nur mit dynamischen Speicher kannst du dynamisch Objekte anlegen [...]
Du kannst ja auch den Stack dynamisch allokieren. In C++ gibt es da zwar keine Standard Methode für, aber in C99 gibt es ja VLA und einige Betriebssysteme stellen Funktionen wie man: alloca(3) zur Verfügung.
include <alloca.h> struct foo { }; int main() { foo *ptr=new (alloca(sizeof(foo)))foo; }
-
Ok, ok, aber 1. und 2. sollten ebenfalls Grund genug sein als Schüler sich mit dem Heap abzufinden
MfG SideWinder