unique_ptr と shared_ptr の違い [重複] 質問する

unique_ptr と shared_ptr の違い [重複] 質問する

重複の可能性があるもの:
pimpl: shared_ptr または unique_ptr
スマートポインタ(ブースト)の説明

shared_ptr と unique_ptr の違いを説明していただけますか?

ベストアンサー1

これらのクラスは両方ともスマート ポインターです。つまり、オブジェクトが参照できなくなったときに、そのオブジェクトが自動的に (ほとんどの場合) 割り当て解除されます。 2 つの違いは、各タイプの異なるポインターがリソースを参照できる数です。

を使用する場合、 は1 つのリソースを指すことがunique_ptr最大で 1 つしかできません。 が破棄されると、リソースは自動的に再利用されます。 はどのリソースにも 1 つしか存在しないため、 のコピーを作成しようとすると、コンパイル時エラーが発生します。たとえば、次のコードは不正です。unique_ptrunique_ptrunique_ptrunique_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内部的には、参照カウントリソースを参照するポインタの数を追跡する必要があるため、参照サイクルが発生しないように注意する必要があります。

要するに:

  1. unique_ptr単一のポインタが破棄されたときに再利用されるオブジェクトへの単一のポインタが必要な場合に使用します。
  2. shared_ptr同じリソースへの複数のポインタが必要な場合に使用します。

おすすめ記事