Heim > Backend-Entwicklung > C++ > Kann „shared_ptr' ohne virtuelle Destruktoren in polymorphen Klassen korrekt funktionieren?

Kann „shared_ptr' ohne virtuelle Destruktoren in polymorphen Klassen korrekt funktionieren?

Susan Sarandon
Freigeben: 2024-12-08 13:50:10
Original
720 Leute haben es durchsucht

Can `shared_ptr` Function Correctly Without Virtual Destructors in Polymorphic Classes?

Implementierung von shared_ptr ohne virtuelle Destruktoren

In unserer Debatte stellten wir die Notwendigkeit in Frage, von polymorphen Klassen virtuelle Destruktoren für die Implementierung von shared_ptr zu verlangen. Das vorgelegte Argument behauptete, dass shared_ptr ohne diese Anforderung korrekt funktionieren könnte.

Lassen Sie uns tiefer in die Implementierung von shared_ptr eintauchen, um die Gültigkeit dieser Behauptung zu bestimmen.

Type Erasure and Templated Constructor

shared_ptr nutzt Typlöschung, um einen Löscher im selben Speicherblock wie seine Referenz zu speichern Zähler. Der Typ dieses Löschers ist nicht Teil des Typs shared_ptr. Durch die Verwendung eines auf Vorlagen basierenden Konstruktors kann shared_ptr verschiedene Löschtypen basierend auf der spezifischen verwalteten Klasse berücksichtigen.

Der folgende Konstruktor kann definiert werden, um dies zu handhaben:

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

Bei Verwendung dieses Konstruktors mit Für die Klassen Base und Derived kann der entsprechende Löscher erstellt und gespeichert werden. Dieser Löscher wird aufgerufen, wenn der Referenzzähler auf Null fällt, um eine ordnungsgemäße Objektentsorgung sicherzustellen.

C 11-Standardanforderungen

Der C 11-Standard erfordert dieses Verhalten ausdrücklich für Vorlagenkonstruktor:

"Auswirkungen: Konstruiert ein shared_ptr-Objekt, das den Zeiger besitzt p."

Dies bestätigt, dass shared_ptr den Besitz des übergebenen Zeigers übernimmt und für dessen Zerstörung verantwortlich ist.

Destruktorfunktionalität

Das Destruktorverhalten ist wie folgt definiert:

"Auswirkungen: Wenn dies ein Objekt p und einen Löscher besitzt d, d(p) wird aufgerufen. Andernfalls, wenn this einen Zeiger p besitzt, und delete p aufgerufen wird ), wird der Standard-Destruktor delete zum Entsorgen verwendet Objekt.

Schlussfolgerung

Basierend auf diesen Richtlinien ist es offensichtlich, dass shared_ptr implementiert werden kann, ohne dass polymorphe Klassen über virtuelle Destruktoren verfügen müssen. Die oben genannten Techniken, wie etwa das Löschen von Typen und der auf Vorlagen basierende Konstruktor, ermöglichen es shared_ptr, Objekte jeglichen Typs effektiv zu verwalten, einschließlich solcher, die keinen Polymorphismus unterstützen.

Das obige ist der detaillierte Inhalt vonKann „shared_ptr' ohne virtuelle Destruktoren in polymorphen Klassen korrekt funktionieren?. 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