Der folgende CodeBoost-shared pointer Konstruktor destructor
struct Base
{
public:
Base()
{
std::cout<<"Base Ctr";
}
~Base()
{
std::cout<<"Base Dtr";
}
};
struct Derived : Base
{
Derived()
{
std::cout<<"Derived Ctr";
}
~Base()
{
std::cout<<"Derived Dtr";
}
};
int main()
{
Base* b = new Derived;
delete b;
}
gibt mir die folgende Ausgabe:
Base Ctr
Derived Ctr
Base Dtr
Die Lösung hierfür ist die Basis Destruktor virtuell zu machen.
Allerdings, wenn ich Boost Smart Pointer ohne virtuelle Basis Destruktor verwenden. Ich bekomme eine andere Ausgabe.
int main()
{
boost::shared_ptr<Base> b = boost::make_shared<Derived>();
}
Der Ausgang ist
Base Ctr
Derived Ctr
Derived Dtr
Base Dtr
Wie Shared_ptr der Lage ist, zu steigern, dies zu erreichen, ohne zu beeinflussen (Ich gehe davon aus), um die Basis und Abgeleitete Klassen.
Wie skaliert es für mehrstufige Vererbung, d. H. Basispunkte zu Dervderv wo Dervderv von Derv geerbt wird.
EDIT:
meisten Antworten mir sagen, dass die "Magie" geschieht in make_shared. Ich bekomme jedoch das gleiche Verhalten für den folgenden Code
boost::shared_ptr<Base> ptr(new Derived);
Ihre Klassen haben keine virtuellen Destruktoren. ist das nicht undefiniertes Verhalten? –
Genau der Punkt, den ich versuche herauszufinden. Dieses Verhalten ist nicht im Fall von Boost-Smartpointern definiert –
@PranavKapoor Sie können mein Beispiel ändern, indem Sie der Pointer-Klasse einen weiteren Konstruktor hinzufügen: \t Vorlage expliziter Zeiger (Y * p): p_ (p), Deleter_ (Std :: bind (& default_deleter , p)) {} –
nikitoz