私は現在、に大きく依存するアプリケーションをまとめており、shared_ptr
これまでのところすべてがうまくいっているようですshared_ptr
.
最も認識されている問題の 1 つは、循環依存関係です。これらの問題は、チェーンのオブジェクトの有効期間に影響を与えないshared_ptr
を格納することで解決できます。weak_ptr
ただし、外部オブジェクトへのポインターを a 経由で保存する必要がある場合に頭を悩ませていますweak_ptr
-それが禁止されているのか、推奨されていないのか、それとも安全なのかわかりません
次の図は、私が何を意味するかを説明しています (黒い矢印は を示しshared_ptr
、破線は を示しますweak_ptr
)。
代替テキスト http://img694.imageshack.us/img694/6628/sharedweakptr.png
- 親には
shared_ptr
、 を使用して親を指す 2 つの子へのが含まれますweak_ptr
。 - 最初の子のコンストラクターで、親を介して2 番目の子
weak_ptr
へのポインターを取得し、それをローカルに保存します。
コードは次のようになります。
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/make_shared.hpp>
#include <boost/enable_shared_from_this.hpp>
class child;
class child2;
class parent;
class parent : public boost::enable_shared_from_this<parent>
{
public:
void createChildren()
{
_child2 = boost::make_shared<child2>(shared_from_this());
_child = boost::make_shared<child>(shared_from_this());
}
boost::shared_ptr<child> _child;
boost::shared_ptr<child2> _child2;
};
class child
{
public:
child(boost::weak_ptr<parent> p)
{
_parent = p;
_child2 = boost::shared_ptr<parent>(p)->_child2; // is this safe?
}
boost::weak_ptr<parent> _parent;
boost::shared_ptr<child2> _child2;
};
class child2
{
public:
child2(boost::weak_ptr<parent> p)
{
this->_parent = p;
}
boost::weak_ptr<parent> _parent;
};
int main()
{
boost::shared_ptr<parent> master(boost::make_shared<parent>());
master->createChildren();
}
私はこれをテストしましたが、問題なく動作しているようです(メモリ リークの報告はありません) が、私の質問は次のとおりです: これは安全ですか? もしそうでなければ、なぜですか?