Ich habe ein paar andere ähnliche Fragen zu dem Thema gelesen, aber ich bin immer noch verwirrt über die Verwendung von Löschen für dynamisch zugewiesenen Speicher und virtuellen Destruktoren. Wenn ich ein Objekt der Klasse Base
oder der Klasse Derived
in einer verknüpften Struktur habe, so dass, wenn ich einen Knoten lösche, ich auch alle Knoten löschen möchte, die diesen Knoten einen Vorfahren nennen können. Muss ich dies im Destruktor angeben, wie unten gezeigt? Oder wird sich die Verwendung eines virtuellen Destruktors ohne die beiden delete
s schon darum kümmern?Virtuelle Destruktoren und löschen Schlüsselwort
class Base{ /*...*/ };
class Derived: public Base
{
public:
//various virtual functions//
virtual ~Derived()
{
delete leftPtr;
delete rightPtr;
}
private:
Base* leftPtr = new Derived();
Base* rightPtr = new Derived();
};
Es ist wenig sinnvoll, einen 'virtuellen' Destruktor zu verwenden, wenn Sie keine virtuellen Methoden haben, oder wenn der' Base'-Destruktor nicht 'virtuell' ist –
Dies ist nicht nahe am Kompilieren. 'Base * p = neu abgeleitet;' wird nie funktionieren. –
Dies setzt voraus, dass der Destruktor der Basisklasse der Basis virtuell ist und es verschiedene virtuelle Methoden gibt. Sollte geklärt haben. – LBaelish