我是新來的智能指針,我試圖繞過我的頭爲什麼weak_ptr會在解除引用操作符後過期。我用來測試的代碼是在這裏: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
使用引用操作,它過期。在這方面,是否有防止它(除了不引用它)?
我試圖as mrtnj suggested通過改變節點weak_ptr
到shared_ptr
,但我想我有一個內存泄漏。我改變了node
類
struct node
{
shared_ptr<node> parent;
shared_ptr<node> child;
int val;
};
,然後進行修改的源代碼以添加tryCreate
功能。
void tryCreate()
{
node d = *foo();
}
,然後把它稱爲我main
這樣,我的主要的樣子
int main()
{
tryCreate();
return 0;
}
我使用的Visual Studio 2015年的內存分析,發現有隻分配和釋放操作沒有。我將parent
更改爲weak_ptr
,我看到了釋放。我做錯了什麼,或者確實需要在這些循環條件下使用weak_ptr
?
我敢肯定,子節點不會被銷燬,因爲在語句結尾處銷燬原始父元素之前將'foo'中分配的父節點的'child'指針複製到'd' 。 –
@MilesBudnek:你說得對。謝謝!我非常需要咖啡(和睡眠)。 ;-) –