Nel recente overload journal sotto il tema Far rispettare la regola dello zero, gli autori descrivono come possiamo evitare di scrivere la Regola di cinque operatori, come le ragioni per loro scrittura sono:C++ Regola di Zero: la cancellazione polimorfico e il comportamento unique_ptr
- gestione delle risorse
- eliminazione polimorfico
Ed entrambi questi possono essere curati usando puntatori intelligenti.
Eccomi specificamente interessati nella seconda parte.
Si consideri il seguente frammento di codice:
class Base
{
public:
virtual void Fun() = 0;
};
class Derived : public Base
{
public:
~Derived()
{
cout << "Derived::~Derived\n";
}
void Fun()
{
cout << "Derived::Fun\n";
}
};
int main()
{
shared_ptr<Base> pB = make_shared<Derived>();
pB->Fun();
}
In questo caso, come dell'articolo spiegano gli autori, si ottiene la cancellazione polimorfica utilizzando un puntatore condiviso, e questo funziona.
Ma se sostituisco lo shared_ptr
con un unique_ptr
, non sono più in grado di osservare l'eliminazione polimorfica.
Ora la mia domanda è: perché sono questi due comportamenti diversi? Perché shared_ptr
prendersi cura di eliminazione polimorfico mentre unique_ptr
non lo fa?
come si sta inizializzando il 'unique_pointer'? –
Ha importanza? In ogni caso: unique_ptr pB (new Derived()) –
Arun
Perché 'std :: shared_ptr' porta un puntatore alla funzione deleter. Quando assegni uno 'std :: shared_ptr' a uno compatibile il puntatore è uno dei membri copiati o spostati. Questo non succede con 'std :: unique_ptr' e dato che la tua classe base che non ha un distruttore virtuale ti viene disossata. –