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