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); ... };
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.
SchlussfolgerungBasierend 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!