Heim >Backend-Entwicklung >C++ >Kann shared_ptr ohne virtuelle Destruktoren polymorpher Klassen funktionieren?

Kann shared_ptr ohne virtuelle Destruktoren polymorpher Klassen funktionieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-16 11:45:11135Durchsuche

Can shared_ptr Work Without Polymorphic Class Virtual Destructors?

Shared_Ptr-Implementierung ohne virtuellen Destruktor einer polymorphen Klasse

In der Debatte zwischen Armen Tsirunyan und Daniel Lidström über die Notwendigkeit virtueller Destruktoren für die Shared_ptr-Implementierung, Es ist tatsächlich möglich, einen shared_ptr zu entwerfen, der dies nicht erfordert Destruktoren.

Technische Implementierung

Der Schlüssel zu dieser Implementierung liegt in der Typlöschung. Shared_ptr verwaltet nicht nur Referenzzähler, sondern auch ein Löschobjekt, das im selben Speicherblock gespeichert ist. Der Typ dieses Löschers unterscheidet sich von dem von shared_ptr und ermöglicht so Flexibilität bei der Verwaltung von Objekten mit unterschiedlichen dynamischen Typen.

Ein Konstruktor mit Vorlagen wird eingeführt:

template<class T>
class shared_ptr
{
public:
   ...
   template<class Y>
   explicit shared_ptr(Y* p);
   ...
};

Beim Erstellen eines shared_ptr mit a Zeiger einer abgeleiteten Klasse (z. B. shared_ptr sp (new Derived)), der Vorlagenkonstruktor mit Y=Derived ist aufgerufen. Dieser Konstruktor erstellt das Löschobjekt mit spezifischen Kenntnissen der Derived-Klasse. Bei Erreichen der Referenzanzahl von Null wird dieser Löscher verwendet, um die abgeleitete Instanz sicher zu entsorgen, auch ohne einen virtuellen Destruktor in der Basisklasse.

C 11-Standardanforderungen

Der C 11-Standard definiert explizit die Anforderungen für diesen Konstruktor:

  • Der Zeiger p muss in T* und Y konvertierbar sein muss ein vollständiger Typ sein.
  • Der Ausdruck „delete p“ muss wohlgeformt sein, ein wohldefiniertes Verhalten haben und darf keine Ausnahmen auslösen.

Für den Destruktor:

  • Wenn shared_ptr leer ist oder den Besitz teilt, gibt es keine Nebenwirkungen.
  • Wenn shared_ptr ein Objekt besitzt mit einem Löscher d wird d(p) aufgerufen.
  • Ansonsten, wenn shared_ptr einen Zeiger p besitzt, wird „delete p“ aufgerufen.

Somit verwendet die shared_ptr-Implementierung den Typ Löschen und verwaltet Löscher sorgfältig, um Objekte mit unterschiedlichen dynamischen Typen effektiv zu entsorgen, auch ohne dass virtuelle Destruktoren in polymorphen Klassen erforderlich sind.

Das obige ist der detaillierte Inhalt vonKann shared_ptr ohne virtuelle Destruktoren polymorpher Klassen funktionieren?. 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