2016-06-30 5 views
8

Se scrivo un metodo factory che istanzia un oggetto localmente e poi restituisce per valore, intendendo sfruttare NRVO (come da alcune delle risposte qui: c++11 Return value optimization or move?), un puntatore/riferimento al punto dell'oggetto locale all'oggetto a cui è assegnato il valore di ritorno del metodo?Memorizzazione di un puntatore all'oggetto restituito con NRVO

Object ObjectBuilder::BuildObject(void) 
{ 
    Object obj; 

    //this->ObjectReference = obj; //Disregard this 
    //OR 
    this->ObjectPtr = &obj; 

    return obj; 
} 

In uso:

ObjectBuilder builder; 

Object newObject = builder.BuildObject(); 

fa builder.ObjectPtr riferiscono a newObject?

+1

Questo è UB, potrebbe succedere di tutto. – lorro

+2

Sembra un biglietto gratuito per UndefinedBehavior Land, anche se consideriamo l'ellisse garantita in C++ 17. Anche se la tua funzione fa ciò che pensi che farebbe, come garantisci che il chiamante manterrà la vita dell'oggetto per tutto il tempo in cui il tuo "ObjectBuilder" lo accederà? – KABoissonneault

+0

Con RVO garantito (N) di C++ 17 questo potrebbe essere effettivamente valido. – nwp

risposta

5

No.

si memorizza un puntatore penzoloni.

Il tuo programma, quando usa questo puntatore, avrà un comportamento indefinito e cioè quello.

Nessuna quantità di ottimizzazione conveniente ti salverà dal tuo destino.

+2

Più come, si sta restituendo una copia e mantenendo internamente un puntatore pendente – KABoissonneault

+0

@KABoissonneault: Er, giusto :) –

+0

È solo UB se il puntatore memorizzato ha il suo valore letto –

Problemi correlati