Heim >Backend-Entwicklung >C++ >Kann „shared_ptr' ohne virtuelle Destruktoren in polymorphen Klassen funktionieren?
Nicht-polymorphe gemeinsame Hinweise: Die Geheimnisse enthüllen
Die hitzige Debatte zwischen Herrn Lidström und Herrn Tsirunyan wirft eine grundlegende Frage auf: Ist Es ist möglich, shared_ptr zu implementieren, ohne virtuelle Destruktoren für Polymorphie vorzuschreiben Unterricht?
Mr. Lidströms Behauptung, dass shared_ptr
Der C 11-Standard und die Boost-Bibliothek zeigen jedoch, dass ein solcher Eine Umsetzung ist tatsächlich möglich. Dieses Kunststück wird durch das Konzept der „Typlöschung“ erreicht:
template<class T> class shared_ptr { public: ... template<class Y> explicit shared_ptr(Y* p); ... };</p> <p>Im bereitgestellten Beispiel shared_ptr<Base><sp(new Derived); wird der Vorlagenkonstruktor mit Y=Derived erstellt und initialisiert das shared_ptr-Objekt. Entscheidend ist, dass dieser Konstruktor einen Zeiger auf einen Steuerblock speichert, der die Referenzzähler und ein Löschobjekt enthält, das speziell auf die abgeleitete Klasse zugeschnitten ist.</p> <p>Wenn der Referenzzähler auf Null fällt, wird das Löschobjekt mit seinem Wissen über die ausgestattet Die Struktur der abgeleiteten Klasse wird aufgerufen, um den zugewiesenen Speicher zu entsorgen.</p> <p>Der C 11-Standard spezifiziert dieses Verhalten explizit in den Anforderungen für Konstruktor:</p> <pre class="brush:php;toolbar:false">Requires: ... The expression delete p shall be well formed, shall have well defined behaviour and shall not throw exceptions. Effects: Constructs a shared_ptr object that owns the pointer p.
Dadurch wird sichergestellt, dass der Löscher ordnungsgemäß aufgerufen und der Speicher sicher freigegeben wird, auch wenn der Zeiger von „Derived“ auf „Basis“ umgewandelt wurde.
In ähnlicher Weise beschreibt der Standard die Destruktoren Verhalten:
Effects: ... Otherwise, if *this owns a pointer p, and delete p is called.
Durch die Verwendung von Vorlagenkonstruktoren und Typlöschung kann shared_ptr die Notwendigkeit von Virtual vermeiden Destruktoren in polymorphen Klassen, die eine effiziente Speicherverwaltung für ein breiteres Spektrum von Szenarien ermöglichen.
Das obige ist der detaillierte Inhalt vonKann „shared_ptr' ohne virtuelle Destruktoren in polymorphen Klassen funktionieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!