unique_ptr
non è copiabile, è solo mobile.
Ciò influenzerà direttamente Test, che è, nel secondo esempio, anche solo mobile e non copiabile.
In effetti, è bene che tu usi ciò unique_ptr
che ti protegge da un grosso errore.
Ad esempio, il problema principale con il tuo primo codice è che il puntatore non viene mai eliminato, il che è davvero, davvero brutto. Di ', potresti risolvere questo problema:
class Test
{
int* ptr; // writing this in one line is meh, not sure if even standard C++
Test() : ptr(new int(10)) {}
~Test() {delete ptr;}
};
int main()
{
Test o;
Test t = o;
}
Anche questo è un male. Cosa succede se copi Test
? Ci saranno due classi che hanno un puntatore che punta allo stesso indirizzo.
Quando uno Test
viene distrutto, distruggerà anche il puntatore. Quando il tuo secondo Test
viene distrutto, cercherà di rimuovere anche la memoria dietro il puntatore. Ma è già stato cancellato e avremo qualche errore di runtime di accesso alla memoria non valido (o comportamento indefinito se siamo sfortunati).
Quindi, il modo giusto è implementare il costruttore di copia e l'operatore di assegnazione della copia, in modo che il comportamento sia chiaro e possiamo creare una copia.
unique_ptr
è molto più avanti di noi qui. Ha il significato semantico: " Io sono unique
, quindi non puoi semplicemente copiarmi " . Quindi, ci impedisce l'errore di implementare ora gli operatori a portata di mano.
È possibile definire il costruttore di copia e l'operatore di assegnazione della copia per un comportamento speciale e il codice funzionerà. Ma tu sei, giustamente (!), Costretto a farlo.
La morale della favola: usare sempre unique_ptr
in questo tipo di situazioni.