2017-10-05 1 views
0

This erscheint ähnlich wie wo ich gehe und this Frage.C++ Inner Class Destructor Ressourcenmanagement

sich das folgende

template<typename T> 
class A 
{ 

private: 

    class B 
    { 

    private: 

     B* link; 

    public: 

     B(); 
     ~B(); 

    }; 

    B* head; 

public: 

    A(); 
    ~A(); 
}; 

Die oben unter Übernahme der Funktion, die die Struktur erzeugt zu erstellen und verbinden jede B deklariert und definiert

EI6yn6W

Wenn ich die Operation durchführen, wie oben gezeigt, , dann

B* position = head; 
position = head->link; 
head->link = nullptr; 
delete[] head; 
head = position; 

Ich verstehe, dass der Aufruf des inneren Klassen-Destruktors zum Aufruf des äußeren Klassen-Destruktors führt. Habe ich richtig Müll behandelt beim Sammeln der Ressource x oder habe ich etwas undefiniertes gemacht?

+1

Warum denken Sie, die innere Klassendestruktor Aufruf (die Sie nie Machen Sie in dem Beispiel, das Sie gepostet haben, dass der äußere Klassendestruktor aufgerufen wird? Es ist genau umgekehrt, oder? – bnaecker

+1

"Habe ich etwas Undefiniertes gemacht?" Ja. Der Aufruf von 'delete []' auf einem Nicht-Array-Typ ist UB. – bnaecker

+0

Ich denke, Sie verwechseln "innere" Klasse mit "Basis" -Klasse. Wenn die Basisklasse über einen virtuellen Destruktor verfügt, dann wird der Destruktor der abgeleiteten ("äußeren") Klasse aufgerufen, wenn der (innere) Klassendestruktor der Klasse aufgerufen wird. Und es gibt kein "Müllsammeln" in C++. – VTT

Antwort

0

In dem bereitgestellten Code wird die innere Klasse den Destruktor der äußeren Klasse nicht aufrufen, auch nicht, da die äußere Klasse nur einen Zeiger auf die innere Klasse als Mitglied hat.

Es ist keine Garbage Collection erforderlich, wenn A mit automatischer Speicherdauer erstellt wird (d. H. Als Variable ohne Neuerung). Es wird zerstört, wenn es außer Reichweite gerät. Als Faustregel gilt, dass jede new eine übereinstimmende delete haben sollte.

Zur Veranschaulichung ich den Code vereinfacht haben, platziert den Knoten Entferncode in einer Elementfunktion und zur Verfügung gestellt, ein einfaches Beispiel für seine Verwendung:

struct A 
{ 
    struct B 
    { 
     B* link; 
    }; 
    B* head; 
    void delete_head() 
    { 
     B* position = head; 
     position = head->link; 
     //head->link = nullptr; // not needed, it is being deleted anyway 
     delete head; // not delete[]! This isn't an array pointer 
     head = position; 
    } 
}; 

int main() 
{ 
    A a; 
    a.head = new A::B; // create head node 
    a.head->link = new A::B; // create node 
    a.delete_head(); // call A::~B() 
    a.delete_head(); // call A::~B() 
    // no more nodes in a, but A's destructor is not yet called 
} // A::~A() is called here