Wie viel tut der Standarddestruktor?

8

Löscht der Standarddestruktor in C ++ - Klassen automatisch Elemente, die nicht explizit im Code zugeordnet sind? Zum Beispiel:

%Vor%

Löscht myC automatisch myC's arr? Oder muss ich C's Destruktor schreiben, um dies explizit zu tun?

    
Robz 31.03.2012, 03:24
quelle

5 Antworten

5

Der Konstruktor (in Ermangelung einer beliebigen ctor-Initialisiererliste ) ruft den Standardkonstruktor für jedes Unterobjekt auf.

Da Sie keine Basisklassen haben und Ihre Elementvariablen primitive Typen sind, wird nichts unternommen.

Gleiches gilt für den Destruktor. Ihr Compiler wird implizit generiert, da Sie keinen deklariert haben und der Destruktor für jedes Unterobjekt aufgerufen wird. Wiederum ist das trivial, weil Ihr einziges Unterobjekt ein Aggregat von Primitiven ist.

Nun wird der gesamte Speicher der Klasse freigegeben, wenn Sie ihn löschen. Da das Array in der Klasse eingebettet ist, gehört es zur selben Speicherregion und wird gleichzeitig freigegeben.

    
Ben Voigt 31.03.2012, 03:28
quelle
5

Der implizit definierte (Standard) Destruktor wird den Destruktor für jedes Mitglied aufrufen. Im Falle eines Member-Arrays wird der Destruktor für jedes Element des Arrays aufgerufen.

Beachten Sie, dass Zeiger keine Destruktoren haben; Sie müssen sie manuell löschen. Sie haben dieses Problem nicht in dem bereitgestellten Beispiel, aber es ist etwas zu beachten.

    
Mark Ransom 31.03.2012 03:28
quelle
5

Wenn Ihre Klasse / Struktur einen Zeiger enthält und Sie explizit etwas zuweisen, auf das sich der Zeiger beziehen soll, müssen Sie normalerweise einen passenden delete im dtor schreiben. Elemente, die direkt in die Klasse / Struktur eingebettet sind, werden automatisch erstellt und gelöscht.

%Vor%

Hier wird X :: x automatisch erstellt / zerstört. X :: y (oder, um technisch korrekt zu sein, worauf X :: y zeigt) wird nicht - wir ordnen es im ctor zu und zerstören es im dtor.

    
Jerry Coffin 31.03.2012 03:28
quelle
0

Alles, was Sie für neu aufrufen, muss entsprechend gelöscht werden. Wenn Sie nicht neu aufgerufen haben, um eine Instanz von etwas zu erstellen, müssen Sie nicht löschen aufrufen.

    
Cramer 31.03.2012 03:55
quelle
-1

Sie müssen keinen Destruktor schreiben. C ++ - Klasse verfügt über den Standarddestruktor, um das Objekt nach "return 0" zu löschen, um den Speicher zu recyceln.

    
bruce 31.03.2012 04:32
quelle