2015-06-16 17 views
12
unique_ptr<A> myFun() 
{ 
    unique_ptr<A> pa(new A()); 
    return pa; 
} 

const A& rA = *myFun(); 

Questo codice compila ma rA contiene dati inutili. Qualcuno può spiegarmi perché questo codice è valido?Dereferenziamento di un unique_ptr temporaneo

Nota: se si assegna la restituzione di myFun a una variabile unique_ptr prima di annullarla, funziona correttamente.

+2

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. –

+0

@buttifulbuttefly Ho visto che nel dessasage, non capisco come viene avviata la chiamata del distruttore. – Kam

+9

[Come visto in TV] (https://www.youtube.com/watch?v=hEx5DNLWGgA#t=44m2s) –

risposta

8

Il unique_ptr passerà la proprietà a un altro unique_ptr, ma nel codice non c'è nulla per acquisire la proprietà dal puntatore di ritorno. In altre parole, non può trasferire la proprietà, quindi verrà distrutta. Il modo corretto è:

unique_ptr<A> rA = myFun(); // Pass the ownership 

o

const A rA = *myFun(); // Store the values before destruction 

Nel codice, il puntatore di ritorno sarà desructed e il riferimento sta riferendosi ad un oggetto che sta distruggendo presto, dopo che l'utilizzo di questo invoca riferimento un comportamento indefinito.

5
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.

Problemi correlati