c++ objekt einer Klasse löschen

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Du hast meinAuto auf dem Stack angelegt. Das heißt, du kannst es nicht löschen, das Objekt existiert automatisch über seine gesamte Lebenszeit, in dem Fall der globalen Variable also die ganze Programmlaufzeit über. Wenn du das Objekt manuell löschen willst, dann muss es auf den Heap, also

//zerstöre meinAuto;
Auto *meinAuto = new Auto();
delete(meinAuto);

Einfach hier mal die Basics lernen: http://www.informit.de/books/c++21/data/start.htm

So einfach wie du es oben andeutest, hast du nicht einmal ein Auto erzeugt (es fehlt der Konstruktor!). Erst wenn ein Auto erzeugt wurde, kann man es auch zerstören. Dafür braucht man einen Destruktor …

fairytale48  28.01.2014, 13:17

der Kompiler erzeugt hier automatisch einen Konstruktor (default constructor). Da alle Variablen einfache Variablen sind, arbeitet dieser Konstruktor auch richtig. Das Auto wird also ordentlich erzeugt und als globales Objekt angelegt. Man sollte sich wegen der hier durch die Ratgeber geschilderten Sachverhalte allerdings gut überlegen, ob man das Auto als globales Objekt wirklich braucht.

0
wolfgang1956  28.01.2014, 13:33
@fairytale48

Vielleicht folgte er einfach nur den dümmlichen Standardbeispielen, die so mancher Autor mal auf die schnelle anlegt …

0

Das Auto wird sehr wohl "abgebaut". Lass in seinem Destruktor einfach mal eine Konsolenausgabe machen so von wegen "Dieses Auto-Objekt wird gerade zerstört"! Du wirst sehen, daß diese Ausgabe erscheint.

Wenn Du Objekte in einer ganz bestimmten, explizit von Dir selbst festgelegten Reihenfolge abgebaut (und vorher aufgebaut) haben willst, mußt Du auf das automatische Anlegen von statischen Objekten verzichten. ALLE statischen Datenelemente werden automatisch in einer nicht explizit definierbaren Reihenfolge angelegt.

Übrigens mitnichten zwingend auf dem Stack. Ceevee kennt da nicht alle möglichen Mechanismen. Es gibt auch ein extra Datensegment neben Stack und Heap, in welchem statische Daten gesammelt werden. Zumindest kenne ich das von allen mir bisher durch die Finger geschlüpften Compilern (C, C++, Pascal, Delphi) unter I86-CPU's so. Auf dem Stack landen grundsätzlich nur Sachen, die LOKALE Daten innerhalb von Funktionskörpern sind. Wobei das nicht heißt, daß das Anlegen in einem extra Static-Datensegment zwingend vorgeschrieben ist. DENKBAR ist das Anlegen auf dem Stack genauso. Wie das konkret umgesetzt wird, ist Sache der Compiler-Implementation.

Der Destruktor löscht dein Auto, aber dazu musst es zuerst konstruiert, und nicht nur deklariert werden:

 meinAuto = Auto();
 meinAuto.a = 110;
 meinAuto.b = 80;
 // hier benutzest das Auto
 meinAuto.~Auto();
 // hier kannst du meinAuto nicht benutzen