Objekte lieber auf den Stack oder Heap erzeugen?
-
Hi,
ich kann ja ein Objekt meiner Klasse auf dem Stack oder per new auf dem Heap erzeugen. Wie entscheidet ihr welchen Weg ihr wählt?
-
Ich würde nicht zwischen Stack und Heap, sondern zwischen automatischer und dynamischer Speicheranforderung unterscheiden. Das ist nicht das Gleiche.
Meist – vor allem für lokale Variablen – sind automatische Objekte (Speicherklasse
auto) die beste Wahl. Gründe, zum dynamischen Speicher zu greifen, sind unter anderem:- Sehr grosse Objekte (wobei viele intern auch dynamisch Speicher anfordern, sodass sich das relativiert)
- Polymorphie in vielen Fällen
- Spezifische Anforderungen an die Objekt-Lebensdauer
- Einfacheres Herumschieben im Speicher (z.B. auch für nichtkopierbare Objekte)
Aber manuelles
newunddeleteverwende ich sehr selten, das ist mir zu fehleranfällig. Oft kapsle ich dynamischen Speicher mittels geeigneter Klassen (Smart-Pointer und Container sind die gebräuchlichsten).
-
Danke für die Antwort, bei mir kann ich nur per new das Objekt anlegen,ansonsten erahlte ich die Fehlermeldung
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Window::~Window(void)" (??1Window@@QAE@XZ)" in Funktion "_WinMain@16".
-
Was ist
Windowfür eine Klasse? Gehört sie zu einem dieser netten Frameworks, welche den Programmierer zu dynamischer Speicheranforderung zwingen?
-
ne da habe ich nur versucht die Fenstererzeugung in eine Klasse zu packen. Wenn ich das Objekt mit new erzeuge funktioniert auch alles wunderbar. nur wenn ich es mit z.b Window mein_fester(....) erzeuge kommt der Linkerfehler.
-
Das sieht mir so aus, als ob du mit deiner new-Variante nicht delete benutzt, weshalb der Destruktor von Window nicht benötigt wird, bei auto hingegen wird der Destruktor automatisch aufgerufen, und das kann er nicht, weil du ihn nur deklariert, aber nicht definiert hast.
-
Ich verneige mich vor dir großer Meister, genau das war es. Den Destruktor definiert und alles lief wie geschmiert

-
Und nie
deletevergessen! Das meinte ich mit "fehleranfällig"...
(War hier wohl nur ein kurzer Test, aber Speicherfreigabe geht genügend oft zu schnell in Vergessenheit).
-
Ja das habe ich auch so gelesen. Ist das richtig das man dann new und delete am besten in einen konstruktor und destruktor einer KLasse packt damit man dann nach RAII vorgeht, also die Speicherfreigabe dann automatisch geschieht wenn das objekt z.B. durch scope verlassen zerstört wird?
-
cppfrager schrieb:
Ja das habe ich auch so gelesen. Ist das richtig das man dann new und delete am besten in einen konstruktor und destruktor einer KLasse packt damit man dann nach RAII vorgeht, also die Speicherfreigabe dann automatisch geschieht wenn das objekt z.B. durch scope verlassen zerstört wird?
Ja, dies ist üblicherweise eine sehr gute Idee.
-
cppfrager schrieb:
Ja das habe ich auch so gelesen. Ist das richtig das man dann new und delete am besten in einen konstruktor und destruktor einer KLasse packt damit man dann nach RAII vorgeht, also die Speicherfreigabe dann automatisch geschieht wenn das objekt z.B. durch scope verlassen zerstört wird?
Sofern kein besonderer Grund vorliegt, bastelst du die Klasse aber besser nicht selbst, sondern verwendest eine der vorhandenen Smartpointerklassen.
-
So, nachdem mir hier so nett geholfen wurde habe ich mich angemeldet. Danke nochmals, ich werde bestimmt noch viele Fragen haben da ich erst jetzt wieder mit C++ anfangen und früher aber auch nicht gerade weit gelernt hatte.