C++解决share_ptr造成的循环引用
2023-09-27 14:26:02 时间
参考链接:https://blog.csdn.net/yc2zgh1314/article/details/51264963
https://www.cnblogs.com/duacai/p/13341422.html
先看有循环引用问题的代码:
#include<iostream>
using namespace std;
struct Node
{
shared_ptr<Node> _pre;
shared_ptr<Node> _next;
~Node()
{
cout << "~Node():" << this << endl;
}
int data;
};
void FunTest()
{
shared_ptr<Node> Node1(new Node);
shared_ptr<Node> Node2(new Node);
Node1->_next = Node2;
Node2->_pre = Node1;
cout << "Node1.use_count:"<<Node1.use_count() << endl;
cout << "Node2.use_count:"<< Node2.use_count() << endl;
}
int main()
{
FunTest();
system("pause");
return 0;
}
结果(没有释放分配的堆内存):
程序模型图:
出现堆内存没有释放的原因是:
两个堆空间没有释放是因为指向它们的智能指针成员变量没有析构导致引用计数不为0,这个智能指针成员变量没有析构又是因为它们所属的堆对象没有析构,而这两个堆对象没有析构是因为它们被智能指针保管,该智能指针又被指向的堆对象的智能指针成员变量增加了引用计数。
解决的办法就是用weak_ptr取代智能指针成员变量,从而解决shared_ptr智能指针循环引用的问题。
代码:
#include<memory>
#include<iostream>
using namespace std;
struct Node
{
weak_ptr<Node> _pre;
weak_ptr<Node> _next;
~Node()
{
cout << "~Node():" << this << endl;
}
int data;
};
void FunTest()
{
shared_ptr<Node> Node1(new Node);
shared_ptr<Node> Node2(new Node);
Node1->_next = Node2;
Node2->_pre = Node1;
cout <<"Node1.use_count:"<< Node1.use_count() << endl;
cout <<"Node2.use_count:"<< Node2.use_count() << endl;
}
int main()
{
FunTest();
system("pause");
return 0;
}
相关文章
- 队列的基本概念详解,循环队列、链式队列的C++详细实现
- 【C/C++开发】循环中使用递减计数与递增计数的效率区别
- Visual C++网络编程经典案例详解 第8章 网络文件传输 使用Socket传输文件 服务器代码 程序初始化
- C++主流编译器整理(编译器版本--供应商--C++11支持情况)
- C++:二叉搜索树
- C++: byte 和 int 的相互转化
- C++11里面的Lambda表达式
- C++中的智能指针
- Effective C++条款01: 视C++为一个语言联邦
- 基于数组的循环队列(C++模板实现)
- tricky c++ new(this)
- C++ – 动态链接库dll为什么要使用unsigned char作为byte的内部格式
- C++ STL 中list是双向循环链表中循环可以实现什么功能?
- 抛开flash,自己开发实现C++ RTMP直播流播放器
- 【PAT乙级真题】1008 数组元素循环右移问题(分数 20)(C++)
- [C++ STL] deque使用详解
- 【C++】引用详解
- C++ 中使用boost::property_tree读取解析ini文件