27

とについて質問がstd::unique_ptrありstd::shared_ptrます。いつ使用するかについてはたくさんの質問があることは知っていますが、それを正しく理解しているかどうかはまだわかりません。スマートポインタのデフォルトの選択はであるはずだとどこかで読んだのですstd::unique_ptrが、私が理解しているように、私のニーズにはむしろを使用する必要がありますstd::shared_ptr。たとえば、私は次のようにしています。

class B;
class A
{
private:
   B* b;
public:
   B* getB();
};

A::getB()
{
   return b;
}

したがって、基本的にクラスAは型のオブジェクトへのポインタを所有しB、このポインタを返すメソッドがあります。shared_ptrgetterを作成する場合、他のクラスがこのポインターにアクセスできると想定しているため、の代わりに使用する必要がありunique_ptrます。私は正しいですか、それともまだわかりませんか?

4

5 に答える 5

24

簡単な答え:状況によります。

所有するAがスコープ外になっている間に、によって返されるポインタがgetBどこかに格納/使用される可能性があるかどうかによって異なります。違いは、所有権に関するものであり、ポインタの数に関するものではありません。

  • の結果を使用するときにAがまだ存在する場合は、getBaを格納してunique_ptr、プレーンポインタ(または、getB返すことができない場合は参照nullptr)を返すことができます。それは「AはBを所有し、他の誰も所有していない」という意味です。
  • の結果を使用/保持しているときにAがスコープ外になる可能性があるgetBが、BがAと一緒に(または直後に)スコープ外になる場合は、aを格納してashared_ptrを返しますweak_ptr
  • の呼び出し元を含む多くのオブジェクトgetBがBを保持している可能性があり、明確な単一の所有者がいない場合は、shared_ptrsを格納して返します。
于 2013-02-14T09:44:27.570 に答える
7

B b;例として、ポインタが本当に必要であり、それをカットしないと仮定しましょう(たとえば、Bは多形です)。

シナリオアルファ

したがって、AはB所有者です。

private:
   std::unique_ptr<B> b;

そしてgetB、そのBのビューを提供します。

public:
   B& getB();


B& A::getB()
{
   return *b;
}

シナリオベータ

AはBの所有者の1人です。

private:
   std::shared_ptr<B> b;

そして、AはそのBの所有権を他の人に与えることができます。

public:
   std::shared_ptr<B> getB();


std::shared_ptr<B> A::getB()
{
   return b;
}
于 2013-02-14T09:38:13.610 に答える
2

ではなくベアポインタを返すshared_ptrため、ポインタを共有しても何も解決されません。を返すかshared_ptr、を使用しunique_ptrます。どうすれshared_ptrば実装できるか考えてみてください。これで私の主張が明確になると思います。

于 2013-02-14T09:35:59.073 に答える
2

私はあなたが正しいと思います。Bのプライベートメンバーとしてポインタを話すだけならA、私はを使用すると思いますstd::unqiue_ptr

于 2013-02-14T09:36:02.187 に答える
2

質問には十分な情報がありません。

スマートポインタは、所有権のセマンティクスをキャプチャして実装します。Aオブジェクトがオブジェクトを所有している場合BAを破棄すると、が破棄されます。B次に、を使用しますunique_ptr。しかしunique_ptr、ここでは良いリターンタイプにはなりません。それはメンバーだけであり、あなたはまだ裸のポインタを返すでしょう。

BクライアントがB無期限に使用し続けることができる手段を取得する場合はshared_ptr、共有所有権になるため、を使用します。

于 2013-02-14T09:38:16.923 に答える