首页 > 其他分享 > 8.智能指针的循环引用

8.智能指针的循环引用

时间:2023-08-02 22:23:08浏览次数:35  
标签:sp1 sp2 value 智能 引用 ptr 指针

8.智能指针的循环引用

循环引用是指使用多个智能指针share_ptr时,出现了指针之间相互指向,从而形成环的情况,有点类似于死锁的情况,这种情况下,智能指针往往不能正常调用对象的析构函数,从而造成内存泄漏。举个例子:

#include <iostream>
using namespace std;

template <typename T>
class Node
{
public:
	Node(const T& value):_pPre(NULL), _pNext(NULL), _value(value)
	{
		cout << "Node()" << endl;
	}
	~Node()
	{
		cout << "~Node()" << endl;
		cout << "this:" << this << endl;
	}

	shared_ptr<Node<T>> _pPre;
	shared_ptr<Node<T>> _pNext;
	T _value;
};

void Funtest()
{
	shared_ptr<Node<int>> sp1(new Node<int>(1));
	shared_ptr<Node<int>> sp2(new Node<int>(2));

	cout << "sp1.use_count:" << sp1.use_count() << endl;
	cout << "sp2.use_count:" << sp2.use_count() << endl;

	sp1->_pNext = sp2; //sp2的引用+1
	sp2->_pPre = sp1; //sp1的引用+1

	cout << "sp1.use_count:" << sp1.use_count() << endl;
	cout << "sp2.use_count:" << sp2.use_count() << endl;
}

int main()
{
	Funtest();
	system("pause");
	return 0;
}
//输出结果
//Node()
//Node()
//sp1.use_count:1
//sp2.use_count:1
//sp1.use_count:2
//sp2.use_count:2

从上面shared_ptr的实现中我们知道了只有当引用计数减减之后等于0,析构时才会释放对象,而上述情况造成了一个僵局,那就是析构对象时先析构sp2,可是由于sp2的空间sp1还在使用中,所以sp2.use_count减减之后为1,不释放,sp1也是相同的道理,由于sp1的空间sp2还在使用中,所以sp1.use_count减减之后为1,也不释放。sp1等着sp2先释放,sp2等着sp1先释放,二者互不相让,导致最终都没能释放,内存泄漏。

在实际编程过程中,应该尽量避免出现智能指针之前相互指向的情况,如果不可避免,可以使用使用弱指针——weak_ptr,它不增加引用计数,只要出了作用域就会自动析构。

标签:sp1,sp2,value,智能,引用,ptr,指针
From: https://www.cnblogs.com/codemagiciant/p/17601935.html

相关文章

  • 3.使用智能指针管理内存资源,RAII是怎么回事?
    3.使用智能指针管理内存资源,RAII是怎么回事?什么是RAII?RAII是ResourceAcquisitionIsInitialization(wiki上面翻译成“资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时......
  • 6.关于this指针你知道什么?全说出来
    6.类的*this指针有以下特点1.每个对象都有一个隐藏的this指针,但不属于对象,是编译器添加的2.this只能在成员函数中使用。全局函数、静态函数都不能使用this。实际上,成员函数默认第一个参数为T*constthis。如:classA{public: intfunc(intp) { }};其中,func的原型在......
  • C++逆向分析——引用
    voidmain(){intx=1;int&ref=x;ref=2;printf("%d\n",ref);return;}反汇编代码:intx=1;00724A5FC745F401000000movdwordptr[x],1int&ref=x;00724A668D45F4lea......
  • C++逆向分析——this指针
    this指针概述C++是对C的拓展,C原有的语法C++都支持,并在此基础上拓展了一些语法:封装、继承、多态、模板等等。C++拓展新的语法是为了让使用更加方便、高效,这样就需要编译器多做了很多事情,接下来我们就需要一一学习这些概念。封装之前我们学习过结构体这个概念,那么结构体可以做参数传......
  • 什么是智能一体化机柜?
     智能一体化机柜是一种集成了多种功能的设备,用于存放和管理计算机硬件、网络设备以及机房相关设备。它不仅仅是一个普通的机柜,而是在机柜内集成了液冷系统、环境监控、智能配电、智能机柜管理等功能。通过这些功能,智能一体化机柜可以实现对机房环境、设备状态和能耗等方面的实时......
  • 基于工业物联网平台的智能电网系统有何功能
    电力系统促进了我国各行各业的发展的人们生活水平的提高,很多重要行业都离不开电力系统的支持,因此,以智能电网为代表的新型电力系统受到很多关注和重视。 智能电网是利用物联网技术、数据通信技术与电网基础结合在一起的现代化电网。数之能提供了工业数据采集平台,实现了传感监测、制......
  • TSINGSEE青犀视频智能视频监控EasyCVR如何将实时监控视频流分享出去?
    开源EasyDarwin视频监控平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。有新用户部署了EasyCVR安防视频平台后,咨......
  • WPS AI震撼亮相世界人工智能大会:金山办公引领智能办公未来!
    金山办公于7月6日在2023世界人工智能大会上展示了其基于大语言模型的智能办公助手WPS AI,并同时推出了WPSAI官网(ai.wps.cn)。同时,他们还开启了招募智能办公体验官的通道,其中WPS Office个人用户和WPS 365企业用户均可参与申请。WPS AI是国内协同办公赛道首款类ChatGPT的应用程序,它......
  • TSINGSEE青犀视频智能视频监控EasyCVR如何将实时监控视频流分享出去?
    开源EasyDarwin视频监控平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。有新用户部署了EasyCVR安防视频平台后,咨询我......
  • 高通SDM450核心板4G安卓智能模块_高通开发板方案定制
    高通SDM450安卓核心板是工业级高性能,可运行android9.0操作系统的4G智能模块。高通SDM4504G核心板采用台积电14nmFinFET制程工艺,8*Cortex-A53架构,搭载Android9.0操作系统,主频最高达1.8GHz。高通SDM450安卓核心板基本概述:高通SDM450安卓核心板是一款基于高通平台、工业级......