2013-04-17 17 views
37

Data la situazione comune in cui la durata di vita di un oggetto di proprietà è collegata al suo proprietario, posso utilizzare un puntatore univoco in 2 modi. .Devo assegnare o resettare un unique_ptr?

può essere assegnato:

class owner 
{ 
    std::unique_ptr<someObject> owned;  
public: 
    owner() 
    { 
     owned=std::unique_ptr<someObject>(new someObject());   
    } 
}; 

Il metodo di ripristino può essere utilizzato:

class owner 
{ 
    std::unique_ptr<someObject> owned;  
public: 
    owner() 
    { 
     owned.reset(new someObject()); 
    } 
}; 

Nell'interesse di best practice, dovrei preferire una forma sopra l'altro?

MODIFICA: Scusate gente. Ho semplificato questo. L'allocazione dell'heap avviene in un metodo di inizializzazione e non nel ctor. Pertanto, non posso utilizzare gli elenchi di inizializzatori.

risposta

27

Da the docs of unique_ptr's operator=:

Trasferimenti la proprietà dell'oggetto puntato da r per * questo come se chiamando reset(r.release()) seguito da un incarico da std::forward<E>(r.get_deleter()).

E tutto ciò che serve di che è la chiamata reset, quindi è più semplice chiamare solo direttamente

+26

So che è tardi, ma solo per i futuri lettori. Secondo Scott Meyers nel suo libro Effective Modern C++, è preferibile std :: make_unique , perché offre un'eccezione di sicurezza: owner = std :: make_unique (). Il problema è che std :: make_unique fa parte di C++ 14 (non C++ 11), ma qui puoi trovare [qui] (https://isocpp.org/files/papers/N3656.txt) a buona implementazione che puoi copiare e incollare. –

15

Il modo corretto per fare questo (che non hai lista) è quello di utilizzare il costruttore di owned:

owner() : owned(new someObject()) 
{} 

A parte che preferisco reset come non si crea un inutile intermedio istanza in quel caso (anche se potrebbe non esserci alcuna differenza a livello di macchina dato che l'ottimizzatore può fare molto lì).

+1

"Preferirei di reset, come non si crea un'istanza intermedia inutile" - che ottiene. Grazie – learnvst