저는 스마트 포인터를 처음 접했고 약식 연산자를 사용한 후 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
가 역 참조 연산자를 사용하는 경우, 만료 왜 이해가 안 돼요. 이것에 관해서는, 그것을 방지하기위한 어쨌든 (역 참조가 아닌)?
나는
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;
}
처럼 비주얼 스튜디오 2015의 메모리 프로파일 링을 사용하는 것이 내 main
등에 전화 만 할당없이 할당 해제가 있었다 것으로 나타났습니다. parent
을 weak_ptr
으로 변경했는데 할당이 끊어졌습니다. 내가 틀린 일을하고 있습니까? 아니면 실제로 이러한 순환 조건에서 weak_ptr
을 사용해야합니까?
'foo '에 할당 된 부모 노드의'child' 포인터가 원래 부모가 문장의 끝에서 파괴되기 전에'd'에 복사되기 때문에 자식 노드가 파괴되지 않는다고 확신합니다 . –
@MilesBudnek : 네 말이 맞아. 감사! 나는 커피를 심각하게 필요로한다. ;-) –