我們知道,智能指針可以在絕大多數的情況下解決內存泄漏的問題,但是並不能完全解決,比如智能指針的循環引用可能就會導致內存泄漏。
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;
}