c++的std::shared_ptr,当同时创建几万个时,然后一起释放,为什么内存不会减少?
测试发现:当数量小于1万时能正常释放,当数量在4万时内存只释放一半,当数量为5万时内存全部不释放,内存没有释放的情况下再创建小于5万个智能指针时,内存不会增加
基于Monster 组和GPT的调写:
//shared_ptr 的循环引用
#include<iostream>
#include<memory>
using namespace std;
struct ListNode
{
int _data;
shared_ptr<ListNode> _prev;
shared_ptr<ListNode> _next;
~ListNode(){ cout << "~ListNode()" << endl; }
};
int main(){
shared_ptr<ListNode> node1(new ListNode);
shared_ptr<ListNode> node2(new ListNode);
cout << node1.use_count() << endl;
cout << node2.use_count() << endl;
node1->_next = node2;
node2->_prev = node1;
cout << node1.use_count() << endl;
cout << node2.use_count() << endl;
return 0;
}
小黑:该函数中体现了shared_ptr的循环引用
在两者之间建立了直接联系,如下图所示
小辉:原来是将他们"首尾相连"了啊
,这样的话他们对彼此的依赖
就变大了
小辉:小黑,为啥两个结点在生命周期结束时
没有调用析构函数啊?
小黑:小辉,你看看下面的分析你就知道了
【循环引用分析】:
【问题的出现】