Heim > Backend-Entwicklung > C++ > Kann „shared_ptr' „abgeleitete' Objekte ohne einen virtuellen Destruktor in „Base' verwalten?

Kann „shared_ptr' „abgeleitete' Objekte ohne einen virtuellen Destruktor in „Base' verwalten?

Mary-Kate Olsen
Freigeben: 2024-12-09 20:53:10
Original
458 Leute haben es durchsucht

Can `shared_ptr` Manage `Derived` Objects Without a Virtual Destructor in `Base`?

Shared_Ptr und Polymorphismus ohne virtuelle Destruktoren

In einer aktuellen Debatte behauptete Daniel Lidström, dass ein shared_ptr Mit new Derived erstellt, ist kein virtueller Destruktor in Base erforderlich. In diesem Artikel wird die Machbarkeit einer solchen Implementierung untersucht.

Implementieren von Shared_Ptr ohne virtuelle Destruktoren

Der Schlüssel zu dieser Implementierung liegt in der Typlöschung. Shared_ptr speichert mehr als nur Referenzzähler; Es enthält einen Löscher (der als Teil der Datenstruktur gespeichert ist), der die Objektzerstörung übernimmt. Dieser Löscher kann von beliebiger Art sein und ermöglicht eine Anpassung über den Rahmen von T (dem Vorlagentyp von shared_ptr) hinaus.

Anpassung für abgeleitete Klassen

Beim Erstellen eines shared_ptr< ;Basis> Von einem Derived-Objekt wird ein auf Vorlagen basierender Konstruktor aufgerufen, der die Angabe des konkreten Typs Derived ermöglicht. Der Konstruktor erstellt den erforderlichen Löscher mit Kenntnis des dynamischen Typs und gewährleistet so eine ordnungsgemäße Objektzerstörung auch ohne einen virtuellen Destruktor in Base.

Beispielimplementierung

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

Das Obige Der Konstruktor ermöglicht die Erstellung eines shared_ptr von einem abgeleiteten Objekt.

C 11-Standardanforderungen

Der C 11-Standard verlangt ausdrücklich dieses Verhalten:

  • Der Vorlagenkonstruktor muss sicherstellen dass der Ausdruck delete p ein wohldefiniertes Verhalten aufweist, auch ohne einen virtuellen Destruktor in T.
  • Wenn der shared_ptr Besitzt ein Objekt ohne Löscher, sollte es delete p.
aufrufen

Das obige ist der detaillierte Inhalt vonKann „shared_ptr' „abgeleitete' Objekte ohne einen virtuellen Destruktor in „Base' verwalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage