2013-04-17 9 views
37

Angesichts der allgemeinen Situation, in der die Lebensdauer eines eigenen Objekts mit seinem Besitzer verknüpft ist, kann ich einen eindeutigen Zeiger auf zwei Arten verwenden. .Sollte ich ein unique_ptr zuweisen oder zurücksetzen?

kann es zugeordnet werden:

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

Das Reset-Verfahren verwendet werden kann: Im Interesse der Best-Practice-

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

, soll ich lieber eine Form über die andere?

EDIT: Sorry Leute. Ich habe das vereinfacht. Die Heap-Zuweisung erfolgt in einer Initialisierungsmethode und nicht im Ctor. Daher kann ich Initialisiererlisten nicht verwenden.

Antwort

27

Von the docs of unique_ptr's operator=:

Transfers Eigentum an dem Gegenstand, auf den r * diese wie von reset(r.release()) von std::forward<E>(r.get_deleter()) durch eine Zuweisung gefolgt Aufruf.

Und alles, was Sie davon brauchen, ist der reset Anruf, so ist es einfacher, es nur

+26

Ich weiß, es ist spät, aber nur für zukünftige Leser. Laut Scott Meyers in seinem Buch Effective Modern C++ ist std :: make_unique vorzuziehen, weil es eine Ausnahmesicherheit bietet: owner = std :: make_unique (). Das Problem ist, dass std :: make_unique Teil von C++ 14 ist (nicht C++ 11), aber hier finden Sie [hier] (https://isocpp.org/files/papers/N3656.txt) a gute Implementierung, die Sie kopieren und einfügen können. –

15

Der richtige Weg, dies zu tun (die Sie nicht Liste haben) ist der Konstruktor von owned zu verwenden:

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

von Apart, dass ich reset lieber, wie Sie schaffen keine nutzlosen Zwischen Instanz in diesem Fall (obwohl es auf der Maschinenebene keinen Unterschied geben kann, da der Optimierer dort viel tun kann).

+1

direkt anrufen „Ich würde es vorziehen, Reset, wie Sie eine nutzlose Zwischeninstanz nicht schaffen“ - das wird es. Danke – learnvst