shared_ptr
-
Hallo,
folgender Code:
class A { }; class B : public A { } shared_ptr<A> createA() { shared_ptr<B> Bptr( new B ); return Bptr; }
Wieso kompiliert das? Ich returne ein shared_ptr<B>, obwohl die Methode laut Signatur ein shared_ptr<A> liefert. Was passiert da genau? Ist der Code gefährlich?
-
Normale Derived-To-Base-Konvertierung, um das Verhalten von rohen Zeigern nachzubilden.
Du kannst problemlos
B*
zuA*
konvertieren, Gleiches gilt fürshared_ptr<B>
zushared_ptr<A>
.
-
Die Technik dahinter ist simpel (sog. Generalisierter Kopierkonstruktor):
template <typename Type> class shared_ptr { public: template <typename Convertable> shared_ptr(const shared_ptr<Convertable>&); };
Siehe EC++P-Tipp Nr. 45.
Ob das gefährlich ist? Wenn die abgeleitete Klasse Resourcen verwaltet, sollte die Superklasse polymorph sein (also zumindest einen virtuellen Destruktor haben), sonst gibt's ein Leck.
-
Jodocus schrieb:
Ob das gefährlich ist? Wenn die abgeleitete Klasse Resourcen verwaltet, sollte die Superklasse polymorph sein (also zumindest einen virtuellen Destruktor haben), sonst gibt's ein Leck.
Im Allgemeinen stimmt das, im Falle von boost::shared_ptr oder std::shared_ptr ist es allerdings nicht erforderlich, dass die Basisklasse polymorph ist.
-
Jodocus schrieb:
[...] sollte die Superklasse polymorph sein (also zumindest einen virtuellen Destruktor haben)
Polymorphie impliziert nicht die Existenz eines virtuellen Destruktors. Eine Klasse ist schon dann polymorph, wenn sie mindestens eine virtuelle Funktion hat.