19

重複の可能性:
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つのスマートポインターの主な違いは何ですか?何を使う必要があるのですか?

4

1 に答える 1

46

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));
于 2012-11-20T20:33:55.347 に答える