C++智能指針循環引用導致的內存泄漏

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

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;
}

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章