Il seguente codice dispinta puntatore condiviso costruttore distruttore
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;
}
mi dà il seguente risultato:
Base Ctr
Derived Ctr
Base Dtr
La soluzione a questo è quello di rendere il distruttore base virtuale.
Tuttavia quando uso boost puntatori intelligenti senza distruttore di base virtuale. Ottengo un risultato diverso.
int main()
{
boost::shared_ptr<Base> b = boost::make_shared<Derived>();
}
L'uscita è
Base Ctr
Derived Ctr
Derived Dtr
Base Dtr
Come è aumentare shared_ptr in grado di raggiungere questo obiettivo senza influire (sto supponendo) la base e classi derivate.
Come scalarlo per ereditarietà a più livelli, ovvero i punti base su dervderv in cui dervderv viene ereditato da derv.
EDIT:
La maggior parte delle risposte mi dicono che la "magia" avviene in make_shared. Tuttavia ottengo lo stesso comportamento per il seguente codice
boost::shared_ptr<Base> ptr(new Derived);
vostre classi non hanno distruttori virtuali. non è questo comportamento indefinito? –
Esattamente il punto che sto cercando di capire. Questo comportamento non è definito in caso di boost smart pointers –
@PranavKapoor puoi modificare il mio esempio aggiungendo un altro costruttore alla classe pointer: \t template \t pointer esplicito (Y * p): p_ (p), deleter_ (std :: bind (& default_deleter , p)) {} –
nikitoz