我们知道,智能指针可以在绝大多数的情况下解决内存泄漏的问题,但是并不能完全解决,比如智能指针的循环引用可能就会导致内存泄漏。
class Node {
public:
Node() {
cout << "construction" << endl;
}
~Node() {
cout << "deconstruction" << endl;
}
public:
shared_ptr<Node>next;
};
void test() {
shared_ptr<Node>sp1(new Node);
shared_ptr<Node>sp2(new Node);
sp1->next = sp2;
sp2->next = sp1;
cout << sp1.use_count();
cout << sp2.use_count();
}
int main(){
test();
return 0;
}
可以看到,只触发了构造函数,并未触发析构函数,来通过一个图看看原因。
解决:将Node成员变量中智能指针类型shared_ptr 改为weak_ptr
class Node {
public:
Node() {
cout << "construction" << endl;
}
~Node() {
cout << "deconstruction" << endl;
}
public:
shared_ptr<Node>next;
};
void test() {
shared_ptr<Node>sp1(new Node);
shared_ptr<Node>sp2(new Node);
sp1->next = sp2;
sp2->next = sp1;
cout << sp1.use_count();
cout << sp2.use_count();
}
int main(){
test();
return 0;
}