Heim >Backend-Entwicklung >C++ >Sollte ein rein virtueller Destruktor in C implementiert werden?
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 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.
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.
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!