重複の可能性があるもの:
pimpl: shared_ptr または unique_ptr
スマートポインタ(ブースト)の説明
shared_ptr と unique_ptr の違いを説明していただけますか?
ベストアンサー1
これらのクラスは両方ともスマート ポインターです。つまり、オブジェクトが参照できなくなったときに、そのオブジェクトが自動的に (ほとんどの場合) 割り当て解除されます。 2 つの違いは、各タイプの異なるポインターがリソースを参照できる数です。
を使用する場合、 は1 つのリソースを指すことがunique_ptr
最大で 1 つしかできません。 が破棄されると、リソースは自動的に再利用されます。 はどのリソースにも 1 つしか存在しないため、 のコピーを作成しようとすると、コンパイル時エラーが発生します。たとえば、次のコードは不正です。unique_ptr
unique_ptr
unique_ptr
unique_ptr
unique_ptr<T> myPtr(new T); // Okay
unique_ptr<T> myOtherPtr = myPtr; // Error: Can't copy unique_ptr
ただし、新しい移動セマンティクスを使用して移動unique_ptr
できます。
unique_ptr<T> myPtr(new T); // Okay
unique_ptr<T> myOtherPtr = std::move(myPtr); // Okay, resource now stored in myOtherPtr
同様に、次のようなこともできます。
unique_ptr<T> MyFunction() {
unique_ptr<T> myPtr(/* ... */);
/* ... */
return myPtr;
}
このイディオムは、「管理対象リソースを返します。戻り値を明示的に取得しないと、リソースはクリーンアップされます。取得すると、そのリソースの排他的所有権を持つことになります。」という意味です。このように、 はunique_ptr
のより安全で優れた代替手段と考えることができますauto_ptr
。
shared_ptr
一方、 では、特定のリソースを指す複数のポインタが許可されます。shared_ptr
リソースへの最後のポインタが破棄されると、リソースは割り当て解除されます。たとえば、次のコードは完全に合法です。
shared_ptr<T> myPtr(new T); // Okay
shared_ptr<T> myOtherPtr = myPtr; // Sure! Now have two pointers to the resource.
shared_ptr
内部的には、参照カウントリソースを参照するポインタの数を追跡する必要があるため、参照サイクルが発生しないように注意する必要があります。
要するに:
unique_ptr
単一のポインタが破棄されたときに再利用されるオブジェクトへの単一のポインタが必要な場合に使用します。shared_ptr
同じリソースへの複数のポインタが必要な場合に使用します。