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_ptr
の代わりに unique_ptr
。私は正しいですか、それともまだわかりませんか?
短い答え:場合によります。
所有するAがスコープ外に出たときに、getB
によって返されたポインターがどこかに格納/使用されるかどうかによって異なります。違いはownershipについてであり、ポインタの数についてではありません。
getB
の結果を使用するときにAがまだ存在する場合は、unique_ptr
を格納してプレーンポインター(またはgetB
がnullptr
)。それは「AはBを所有し、他の誰も所有しない」ことを表します。getB
の結果を使用/保持しているときにAがスコープ外になる可能性があるが、BがAと共に(またはその直後に)スコープ外になる場合は、shared_ptr
を格納し、 weak_ptr
を返します。getB
の呼び出し元を含む多くのオブジェクトがBを保持している可能性があり、明確な単一の所有者がいない場合、shared_ptr
sを格納して返します。例として、ポインタが本当に必要であり、B b;
はそれをカットしません(たとえば、Bは多態性です)。
つまり、Aはthe Bの所有者です。
private:
std::unique_ptr<B> b;
そしてgetB
はそのBのビューを提供します。
public:
B& getB();
B& A::getB()
{
return *b;
}
Aはの1つ Bの所有者です。
private:
std::shared_ptr<B> b;
そして、AはそのBの所有権を他人に与えることができます。
public:
std::shared_ptr<B> getB();
std::shared_ptr<B> A::getB()
{
return b;
}
shared_ptr
ではなく、ベアポインターを返すため、ポインターを共有にしても何も解決されません。 shared_ptr
を返すか、unique_ptr
を使用します。どのようにしてshared_ptr
を実装できるかを考えてみてください。これで私のポイントが明確になると思います。
私はあなたが正しいと思います。 B
のプライベートメンバーとしてA
ポインターのみをストーリー化する場合は、std::unqiue_ptr
を使用すると思います。
質問に十分な情報がありません。
スマートポインターは、所有権のセマンティクスをキャプチャして実装します。 A
オブジェクトがB
オブジェクトを所有している場合、A
を破棄するとB
が破棄され、unique_ptr
を使用します。ただし、ここではunique_ptr
は適切な戻り値の型にはなりません。それはメンバーだけであり、あなたはまだ裸のポインターを返します。
B
を取得すると、クライアントがB
を無期限に使用し続けることができることを意味する場合は、shared_ptr
を使用します。これは、所有権が共有されるためです。