Mr. Lidström and I had an argument :)Shared_ptr Magie :)
Herr Lidström Behauptung ist, dass ein Konstrukt shared_ptr<Base> p(new Derived);
keine Basis erfordern einen virtuellen Destruktor zu haben:
Armen Tsirunyan: „Wirklich Wird die shared_ptr sauber aufräumen? Können Sie bitte in diesem Fall demonstrieren, wie dieser Effekt implementiert werden könnte? "
Daniel Lidström: „Der Shared_ptr verwendet seinen eigenen destructor den Beton Instanz löscht Dies als RAII in der C-Community ++ bekannt Mein Rat ist, dass Sie alle lernen Sie RAII können Sie machen Ihre... C++ - Codierung ist so viel einfacher, wenn Sie RAII in allen Situationen verwenden. "
Armen Tsirunyan: „Ich weiß über RAII, und ich weiß auch, dass schließlich die Shared_ptr destructor die gespeicherte px löschen kann, wenn pn 0 erreicht Aber wenn px hatte statischen Typ Zeiger auf
Base
und dynamischen Typ Zeiger auf WennBase
einen virtuellen Destruktor hat, wird dies zu einem undefinierten Verhalten führen.Daniel Lidström: „Die Shared_ptr weiß der statische Typ Beton ist es weiß das, weil ich es in seinem Konstruktor übergeben scheint ein bisschen wie Magie, aber ich kann Ihnen versichern, dass es durch Design und extrem nett.! . "
Also, urteilen Sie uns. Wie ist es möglich (wenn ja), shared_ptr zu implementieren, ohne dass polymorphe Klassen virtuellen Destruktor haben? Vielen Dank im Voraus
Sie könnten mit dem [ursprünglichen Thread] (http://stackoverflow.com/questions/3899688/default-virtual-dtor/3899726) verknüpft haben. –
@Darin: Ich habe es getan. – sbi
Eine andere interessante Sache ist, dass 'shared_ptr p (new Derived)' auch das 'Derived' Objekt durch seinen Destruktor zerstören wird, unabhängig davon, ob es' virtual' ist oder nicht. –
dalle