Neues Objekt per new, Member automatisch im Heap?
-
Hallo, ich hab ein kleines Verständnisproblem beim Erstellen neuer Objekten per new.
Die Situation ist folgende:
Ich habe eine grosse Klasse vom Typ A, welche Variablen und ein Objekt vom Typ B, beinhaltet.class A { private: int varA; B instanzVonB; }; class B { private: int varB; };
Nun zum Problem:
Wenn ich eine Neue Instanz der Klasse A mit new erstelle (A *instanz = new A), ist dann das darin enthaltene (varA und instanzVonB mit VarB) ebenfalls im Heap und nicht auf dem Stack?
Oder muss ich innerhalb der Klassen Zeiger verwenden und in den Konstruktoren jede einzelne Variable ebenfalls mit new allozieren?Danke schon mal im Voraus
mfg
-
Bin nicht sehr gut mit Pointern aber ich glaube das dann die Member auf dem Heap liegen. Kann mir das nicht anders vorstellen.
-
Das ganze Objekt inklusive Member befindet sich im Freestore (dynamischer Speicher in C++). Heap wäre genau genommen dort, wo
malloc()
/free()
wüten, also C.Nebenbei würde ich
new
nur mit gutem Grund verwenden, und dann schön in einen Smart-Pointer kapseln.
-
DrFail schrieb:
Wenn ich eine Neue Instanz der Klasse A mit new erstelle (A *instanz = new A), ist dann das darin enthaltene (varA und instanzVonB mit VarB) ebenfalls im Heap und nicht auf dem Stack?
Ein Objekt liegt immer komplett am Stück im Speicher, inklusive aller seiner Member. Also sind auch alle Member auf dem Heap.
Was dich wahrscheinlich durcheinander bringt: Wenn du einen Pointer als Member hast, dann ist auch nur genau dieser Pointer Teil des Objekts, nicht der Teil, auf den der Pointer zeigt:
struct Foo; struct Bar { Bar() { foo = new Foo(); } ~Bar() { delete foo; } Foo* foo; // Zeiger foo gehört zu Bar-Objekt, aber nicht das Foo-Objekt *foo, das liegt woanders };
-
Wäre es also sinnvoll innerhalb der Klasse möglichst keine Zeiger zu verwenden und dann die Instanz per new zu erstellen?
Konkret zu meinen aktuellen Projekt: Ich bin dabei, mithilfe von Allegro 5 eine Art kleines Framework für 2D-Spiele (besteht hauptsächlich aus einer Klasse) zu erstellen, in der Grundlegende Elemente wie das Laden und Verwalten von Texturen, Input, etc. enthalten sind.
Es würde also reichen, wenn ich bei einem neuen Spiel die Grundklasse des "Frameworks" per new erstelle?
Grössere Daten wie z.B. Texturen werden ja von Allegro schon dynamisch alloziert, wenn ich die entsprechenden Lade-Funktionen benutze.
-
Du solltest weitgehend komplett auf
new
verzichten. Faustregel: Wenn ein Objekt auf den Stack kann, dann tu es auch dahin.
-
Ok, das merke ich mir.
Vielen Dank für die Hilfe!mfg
-
Um einen Stackoverflow wirst du dir sowieso keine Sorgen machen müssen, da der nur bei großen Mengen Objekten (oder hoher Rekursionstiefe) auftritt, und du die meistens in einer Struktur verwaltest, die sowieso den Heap verwendet (zb std::vector)