グラフのノードを格納するshared_ptrを使用するプログラムを作成しました。各ノードには、それが属するノードにshared_ptrを保持する別のオブジェクトが関連付けられています。親の子のshared_ptrがスタックされているため、これを行う適切な方法ではないようです(構築後に親のshared_ptrsをさらに作成するとuse_count()が増加しません)。同じオブジェクトへの複数のshared_ptrs、1つが破損しました
親:
struct Parent : public enable_shared_from_this<Parent>
{
Child myChild;
Parent() :
myChild(shared_ptr<Parent>(this)) // can't use getptr() here -> bad_weak_ptr
{}
shared_ptr<Parent> getptr()
{
return shared_from_this();
}
};
子:
struct Child
{
shared_ptr<Parent> ptr;
Child(shared_ptr<Parent> a) :
ptr(a)
{}
};
テスト:
shared_ptr<Parent> p(new Parent);
cout << "UC of parent: " << p.use_count() << endl;
cout << "UC of child ptr: " << p->myChild.ptr.use_count() << endl;
shared_ptr<Parent> p2(p);
cout << "UC of parent: " << p2.use_count() << endl;
cout << "UC of child ptr: " << p2->myChild.ptr.use_count() << endl;
出力:
UC of parent: 1
UC of child ptr: 1
UC of parent: 2
UC of child ptr: 1 // expected 2!
通常のctor(新規ではありません)からParentを作成し、getptr()でshared_ptrを取得すると、すべてが正常に動作することに気付きました。誰かがこれについて詳しく説明できますか?私は何か愚かなことをしていますか?
ありがとうございます!
確かに 'this'ではなくshared_from_this()を子に渡したいと思いますか? – kfsone
shared_from_this()が動作するためには、オブジェクトのshared_ptrが存在しなければならないので、bad_weak_ptr例外が発生します。 shared_ptr(this)を子に渡そうとしましたが、結果は同じです。 – Managarm
親が死ぬまで(親の* member *)子が死ぬことはないため、子は親への所有権(シュレッド)ポインタを持つべきではありません。 * reference *を子の親に渡す(そして格納する)必要があります。 – Galik