1. ホーム
  2. c++

boost::shared_ptrの取得について

2023-09-12 08:34:31

質問

私は boost:shared_ptr を多用しています。実際、ヒープ上に確保されるオブジェクトのほとんどは shared_ptr . 残念ながら、これは私が this を受け取る関数に shared_ptr . このコードを考えてみましょう。

void bar(boost::shared_ptr<Foo> pFoo)
{
    ...
}

void Foo::someFunction()
{
    bar(this);
}

ここで2つの問題があります。 まず、これはコンパイルできません。 shared_ptr の T* コンストラクタが明示的であるためです。次に、もし私がそれを bar(boost::shared_ptr<Foo>(this)) でビルドを強制すると、私のオブジェクトへの2つ目の共有ポインタが作成され、最終的に二重削除につながることになります。

ここで私の疑問が生じました。これらのオブジェクトの 1 つのメソッドの内部から、存在することがわかっている既存の共有ポインターのコピーを取得するための標準的なパターンはありますか? 押し付けがましい参照カウントを使用することが、ここでの私の唯一の選択肢でしょうか?

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

からの導出が可能です。 enable_shared_from_this を継承し、"this" の代わりに "shared_from_this()" を使って、自分自身の self オブジェクトへの共有ポインタを生成できるようになります。

リンク先の例です。

#include <boost/enable_shared_from_this.hpp>

class Y: public boost::enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership
}

メンバ関数からスレッドを生成する場合、boost::bind to a shared_from_this() の代わりに this を使用するとよいでしょう。 これにより、オブジェクトが解放されないことが保証されます。