Heim >Backend-Entwicklung >C++ >Sollte ein rein virtueller Destruktor in C implementiert werden?

Sollte ein rein virtueller Destruktor in C implementiert werden?

Susan Sarandon
Susan SarandonOriginal
2024-12-23 15:56:11341Durchsuche

Should a Pure Virtual Destructor in C   Be Implemented?

Rein virtueller Destruktor in C: Eine warnende Geschichte

Beim Definieren einer abstrakten Basisklasse in C kann es verlockend sein, einen virtuellen Destruktor als rein virtuell zu deklarieren wird im folgenden Codeausschnitt angezeigt:

class A {
public:
    virtual ~A() = 0;
};

Während diese Syntax in bestimmten Compilern gültig ist, z MSVC stellt eine lauernde Gefahr dar, die zu Laufzeitabstürzen führen kann.

Das Problem: Fehlende Destruktorimplementierung

Das Problem mit dem obigen Code besteht darin, dass der virtuelle Destruktor ohne Bereitstellung als rein deklariert wird eine Umsetzung. Dies bedeutet, dass das Verhalten des Destruktors an konkrete abgeleitete Klassen delegiert wird. Wenn jedoch ein Objekt vom Typ A selbst jemals zerstört wird, wird sein Destruktor aufgerufen und seine fehlende Implementierung führt zu undefiniertem Verhalten.

Mögliche Konsequenzen

In einem typischen Szenario Ableitung aus der abstrakten Basisklasse A und der Versuch, ein Objekt der abgeleiteten Klasse zu zerstören, wird letztendlich den Destruktor von A aufrufen. Ohne Implementierung kann dies auf bestimmten Plattformen undefiniertes Verhalten auslösen, wie z. B. das Aufrufen des Purecall-Handlers und den Absturz des Programms.

Die Lösung: Implementierung des Destruktors

Um dieses Problem zu beheben, wurde die abstrakte Basis verwendet Der Destruktor der Klasse sollte explizit implementiert werden, auch wenn sein Rumpf leer ist. Der korrigierte Codeausschnitt unten zeigt dies:

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

Indem Sie eine leere Implementierung für den Destruktor von A bereitstellen, stellen Sie sicher, dass sein Verhalten definiert ist, wenn es direkt oder über abgeleitete Klassen aufgerufen wird.

Das obige ist der detaillierte Inhalt vonSollte ein rein virtueller Destruktor in C implementiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn