私はスマートポインタを使い慣れていないので、私は弱参照子が逆参照演算子の後に期限切れになる理由を頭に入れようとしています。私がテストに使用されるコードはここにある:C++ weak_ptrは参照解除後に期限切れですか?
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
struct node
{
weak_ptr<node> parent;
shared_ptr<node> child;
int val;
};
shared_ptr<node> foo()
{
shared_ptr<node> a = make_shared<node>();
shared_ptr<node> b = make_shared<node>();
a->val = 30;
b->val = 20;
b->parent = a;
a->child = b;
return a;
}
int main()
{
shared_ptr<node> c = foo();
node d = *foo();
if (c->child->parent.expired())
{
cout << "weak ptr in c has expired." << endl;
}
if (d.child->parent.expired())
{
cout << "weak ptr in d has expired." << endl;
}
return 0;
}
プログラムの出力weak ptr in d has expired.
d
は、間接参照演算子を使用する場合、有効期限が切れる理由を私は理解していません。これに関して、それを防ぐためにとにかく(逆参照しない以外の)存在はありますか?
私はshared_ptr
にノードにweak_ptr
を変更することにより、as mrtnj suggestedを試してみましたが、私はメモリリークを持っていると思います。私は
struct node
{
shared_ptr<node> parent;
shared_ptr<node> child;
int val;
};
にnode
クラスを変更した後tryCreate
機能を追加するためにソースコードを変更しました。その後、
void tryCreate()
{
node d = *foo();
}
とは
int main()
{
tryCreate();
return 0;
}
のように私の主なルックスは、私は、Visual Studio 2015のメモリのプロファイリングを使用してのみ割り当てなし割り当て解除があったことに気づいたというのが私のmain
ようにしてそれを呼びました。 parent
をweak_ptr
に変更しました。割り当てが解除されました。私は間違って何かをしていますか、実際にはこれらの循環状態でweak_ptr
を使用する必要がありますか?
'foo'で割り当てられた親ノードからの' child'ポインタが 'd'にコピーされて元の親がステートメントの終わりに破棄される前に子ノードが破壊されないことは間違いありません。 –
@MilesBudnek:そうです。ありがとう!私は真剣にコーヒー(そして睡眠)が必要です。 ;-) –