unique_ptr<A> myFun()
{
unique_ptr<A> pa(new A());
return pa;
}
const A& rA = *myFun();
Quello che hai fatto su quella ultima riga:
unique_ptr<A>* temporary = new unique_ptr<A>(nullptr);
myFun(&temporary);
const A& rA = *temporary.get();
delete temporary; // and free *temporary
quando si elimina temporary
che ha un contratto con voi che possiede il puntatore e la memoria che si riferisce a. Quindi distrugge lo A
e libera la memoria.
Nel frattempo, hai nascosto un puntatore a quella memoria come riferimento all'oggetto a quell'indirizzo.
Si potrebbe o trasferire il puntatore ad un'unique_ptr locale:
unique_ptr<A> a = myFun();
o si può copiare gli oggetti:
A = *myFun().get();
la 'A' a cui myFun()
s temporanea viene distrutta solo alla chiusura della dichiarazione, quindi è presente per la copia.
Dato che non si sta memorizzando 'unique_ptr' che' myFun' restituisce, il suo distruttore viene chiamato alla fine dell'espressione e l'oggetto di sua proprietà viene liberato. –
@buttifulbuttefly Ho visto che nel dessasage, non capisco come viene avviata la chiamata del distruttore. – Kam
[Come visto in TV] (https://www.youtube.com/watch?v=hEx5DNLWGgA#t=44m2s) –