In einer aktuellen Debatte behauptete Daniel Lidström, dass ein shared_ptr
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); ... };
Das Obige Der Konstruktor ermöglicht die Erstellung eines shared_ptr
C 11-Standardanforderungen
Der C 11-Standard verlangt ausdrücklich dieses Verhalten:
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!