web-dev-qa-db-ja.com

unique_ptr VS auto_ptr

重複の可能性:
std :: auto_ptrからstd :: unique_ptr
どのC++スマートポインター実装が利用可能ですか?

私がこれを持っているとしましょうstruct

struct bar 
{ 

};

このようにauto_ptrを使用すると:

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

次にauto_ptr<bar> mySecondBar = myFirstBar; C++は所有権をmyFirstBarからmySecondBarに転送し、コンパイルエラーは発生しません。

しかし、auto_ptrの代わりにunique_ptrを使用すると、コンパイラエラーが発生します。なぜC++はこれを許可しないのですか?そして、これら2つのスマートポインターの主な違いは何ですか?何を使う必要があるのですか?

18
Maroun

_std::auto_ptr<T>_はサイレントにリソースを盗む可能性があります。これは混乱を招く可能性があり、これを実行できないように_std::auto_ptr<T>_を定義しようとしました。 _std::unique_ptr<T>_を使用すると、所有権はまだ保持しているものからサイレントに譲渡されません。所有権は、ハンドルがないオブジェクト(一時的)または消滅しようとしているオブジェクト(関数のスコープ外になりそうなオブジェクト)からのみ転送されます。本当に所有権を譲渡したい場合は、std::move()を使用します。

_std::unique_ptr<bar> b0(new bar());
std::unique_ptr<bar> b1(std::move(b0));
_
46
Dietmar Kühl