2012-11-20 3 views
16

Mögliche Duplizieren:
std::auto_ptr to std::unique_ptr
What C++ Smart Pointer Implementations are available?unique_ptr VS auto_ptr

Können sagen, ich habe diese struct:

struct bar 
{ 

}; 

Wenn ich auto_ptr verwenden wie folgt aus:

void foo() 
{ 
    auto_ptr<bar> myFirstBar = new bar; 
    if() 
    { 
    auto_ptr<bar> mySecondBar = myFirstBar; 
    } 
} 

dann bei auto_ptr<bar> mySecondBar = myFirstBar; C++ das Eigentum von myFirstBar zu mySecondBar überträgt und es gibt keine Übersetzungsfehler.

Aber wenn ich unique_ptr statt auto_ptr verwenden erhalte ich einen Compiler-Fehler. Warum erlaubt C++ dies nicht? Und was sind die Hauptunterschiede zwischen diesen beiden intelligenten Zeigern? Wann muss ich was benutzen?

+1

Siehe http://stackoverflow.com/questions/5026197/what-c-smart-pointer-implementations-are-available – hmjd

Antwort

42

std::auto_ptr<T> kann stumm die Ressource stehlen. Das kann verwirrend sein und es wurde versucht, std::auto_ptr<T> zu definieren, damit Sie das nicht tun. Mit std::unique_ptr<T> wird das Eigentum nicht stillschweigend von irgendetwas übertragen, das Sie noch halten. Es überträgt das Eigentumsrecht nur von Objekten, an die Sie kein Handle haben (Provisorien) oder die gerade verschwinden (das Objekt wird in einer Funktion außerhalb des Bereichs liegen). Wenn Sie wirklich das Eigentum übertragen möchten, würden Sie std::move() verwenden:

std::unique_ptr<bar> b0(new bar()); 
std::unique_ptr<bar> b1(std::move(b0)); 
+4

Minor Kommentar, die erste Zeile sollte 'new bar' sein, nicht' new std :: unique_ptr ' –

+0

@DaveS: Ja, natürlich. Ich habe die Antwort behoben. Vielen Dank! –