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
Freigeben: 2024-12-06 06:44:12
Original
307 Leute haben es durchsucht

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.
Nach dem Login kopieren

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.
Nach dem Login kopieren

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!

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