


Kann „shared_ptr' ohne virtuelle Destruktoren in polymorphen Klassen funktionieren?
Dec 06, 2024 am 06:44 AMNicht-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<Base><p(new Derived); Dass kein virtueller Destruktor in Base erforderlich ist, sorgt für Aufsehen, da das Löschen eines polymorphen Objekts ohne einen virtuellen Destruktor unter typischen Umständen zu undefiniertem Verhalten führt.
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!

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert?

GULC: C -Bibliothek von Grund auf neu gebaut

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die?

eindeutiger Gebrauch und Phrasenfreigabe

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher?

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)?

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient?
