1. ホーム
  2. c++

[解決済み】unique_ptrとshared_ptrの違い【重複あり

2022-03-31 19:37:02

質問

<ブロッククオート

重複の可能性があります。

pimpl: shared_ptrまたはunique_ptr

スマートポインター(boost)の説明

shared_ptrとunique_ptrの違いについて教えてください。

どのように解決するのですか?

これらのクラスはどちらもスマートポインタです。つまり、そのオブジェクトが参照できなくなったときに、自動的に(ほとんどの場合)そのオブジェクトをデアロケートするのです。 両者の違いは、それぞれのタイプのポインタが1つのリソースをいくつまで参照できるかという点です。

を使用する場合 unique_ptr の場合、最大で1つの unique_ptr は1つのリソースを指しています。 その 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 一方、"Pointer "では、1つのリソースを指す複数のポインタを指定することができます。 最後の 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 は、同じリソースへの複数のポインタが必要な場合です。

お役に立てれば幸いです。