2012-11-20 15 views
16

Powiel możliwe:
std::auto_ptr to std::unique_ptr
What C++ Smart Pointer Implementations are available?unique_ptr VS auto_ptr

Powiedzmy mam ten struct:

struct bar 
{ 

}; 

Gdy używam auto_ptr tak:

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

następnie w auto_ptr<bar> mySecondBar = myFirstBar; C++ przenoszącej własność z myFirstBar do mySecondBar i nie ma błędów kompilacji.

Ale gdy używam unique_ptr zamiast auto_ptr otrzymuję błąd kompilatora. Dlaczego C++ na to nie pozwala? I jakie są główne różnice między tymi dwoma inteligentnymi wskaźnikami? Kiedy muszę użyć czego?

+1

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

Odpowiedz

42

std::auto_ptr<T> może po cichu ukraść zasób. Może to być mylące i próbowano zdefiniować std::auto_ptr<T>, aby nie pozwolić ci tego zrobić. Z std::unique_ptr<T> własność nie będzie cicho przenoszona z niczego, co nadal posiadasz. Przenosi własność tylko z obiektów, do których nie masz dojścia (tymczasowe) lub które mają zniknąć (obiekt ma wyjść z zakresu w funkcji). Jeśli naprawdę chcesz do przeniesienia własności, można użyć std::move():

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

Minor komentarz pierwsza linia powinna być 'nowym słupkiem', a nie' nowym std :: unique_ptr ' –

+0

@DaveS: Tak, oczywiście. Naprawiłem odpowiedź. Dzięki! –