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

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

Patricia Arquette
Patricia ArquetteOriginal
2024-12-06 06:44:12304Durchsuche

Can `shared_ptr` Work Without Virtual Destructors in Polymorphic Classes?

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!

Stellungnahme:
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