Herr Lidström und ich hatten einen Streit :)
Die Behauptung von Herrn Lidström ist, dass für ein Konstrukt shared_ptr<Base> p(new Derived);
Base keinen virtuellen Destruktor benötigt:
Armen Tsirunyan : "Wirklich? Wird der shared_ptr korrekt bereinigt? Könnten Sie bitte in diesem Fall zeigen, wie dieser Effekt implementiert werden könnte?"
Daniel Lidström : "Der shared_ptr verwendet einen eigenen Destruktor, um die Concrete-Instanz zu löschen. Dies wird in der C ++ - Community als RAII bezeichnet. Mein Rat ist, dass Sie alles über RAII lernen. Dies erleichtert Ihre C ++ - Codierung bei der Verwendung erheblich RAII in allen Situationen. "
Armen Tsirunyan : "Ich weiß über RAII Bescheid, und ich weiß auch, dass der Destruktor shared_ptr möglicherweise den gespeicherten px löscht, wenn pn 0 erreicht. Wenn px jedoch einen statischen Typzeiger auf
Base
und einen dynamischen Typzeiger auf hatDerived
, dann, sofernBase
kein virtueller Destruktor vorhanden ist führt zu undefiniertem Verhalten. Korrigieren Sie mich, wenn ich falsch liege. "Daniel Lidström : "Der shared_ptr weiß, dass der statische Typ Concrete ist. Er weiß das, seit ich ihn in seinem Konstruktor übergeben habe! Scheint ein bisschen magisch, aber ich kann Ihnen versichern, dass er beabsichtigt und äußerst nett ist."
Also, beurteilen Sie uns. Wie ist es möglich (wenn ja ), shared_ptr zu implementieren, ohne dass polymorphe Klassen einen virtuellen Destruktor haben müssen? Danke im Voraus
shared_ptr<void> p(new Derived)
das Derived
Objekt auch durch seinen Destruktor zerstört wird, unabhängig davon, ob es ist virtual
oder nicht.
shared_ptr<T>( (T*)new U() )
wo struct U:T
wird nicht das Richtige getan (und dies kann indirekt leicht getan werden, wie eine Funktion, die a übernimmt T*
und a übergeben wird U*
)