当前位置: 首页 > article >正文

【C++ 智能指针】RAII和四种智能指针你理解吗?

文章目录

      • 1. RAII
      • 2. 智能指针

1. RAII

  • 🐧RAII (Resource Acquisition Is Initialization)一种利用对象的生命周期来控制程序资源的技术。

  • 🐧 对象构造时获取资源最后对象析构的时候释放资源

  • 🐧优点:①不需要显示释放资源;②采用这种方式,对象所需的资源在其生命周期内始终保持有效。

2. 智能指针

  • 🍎智能指针的原理
    1)具有RAII特性;
    2)重载了 operator *operator ->,具有像指针一样的行为;

  • 智能指针的头文件为 #include<memory>

  • 🍎智能指针的最大问题: 拷贝问题,因为会析构两次;指针就是浅拷贝问题,共同管理资源;

解决方案:
auto_ptr管理权转移,C++98提出来的,处理方式是转移管理权,此时会导致sp1对象悬空,因为sp1不是将亡值,之后会用到,把管理权转移后,后面的访问会非法。

在这里插入图片描述
在这里插入图片描述


unique_ptr

  • 🐧 同一时刻只能有一个unique_ptr指向给定对象,离开作用域时,若其指向对象,则从其所指对象销毁。
  • 🍎 定义 unique_ptr时,需要将其绑定到一个new返回的指针上。
  • 🐧 不支持普通的拷贝和赋值
class A {

public:
	~A() {
		cout << "~A()";
	}

private:
	int _a1 = 1;
	int _a2 = 1;
};

int main()	
{		
	unique_ptr<A> sp1(new A);
	
	cout << sp1.get() << endl;
	A* p1 = sp1.get();

	unique_ptr<A> sp2(sp1);		// 不支持拷贝

	return 0;
}

shared_ptr
🐧shared_ptr的实现机制是在拷贝构造时使用同一份引用计数
(1)一个模板指针,T* ptr指向实际对象
(2)一个引用计数,必须new出来的,不然会多个shared_ptr里面会有不同的引用次数而导致多次delete
(3)重载operator *operator->,使得像指针一样使用shared_ptr
(4)重载赋值运算符 =,如果原来的shared_ptr已有对象,则让其引用次数减一并判断引用是否为零(是否调用delete),然后将新的对象引用次数加一
(5)重载析构函数,使引用次数减一并判断引用是否为零(是否调用delete
(6)拷贝构造函数,引用次数加一

🍎线程安全问题
(1)同一个 shared_ptr被多个线程是安全的;
(2)同一个shared_ptr被多个线程是不安全的;

在这里插入图片描述
在这里插入图片描述


  • weak_ptr
    🍎weak_ptr是为了配合shared_ptr而引入的一种智能指针;
    它的最大作用是协助shared_ptr工作,像旁观者一样观测资源的使用情况,但weak_ptr没有共享资源,它的构造不会引起指针和引用计数增加。
    和shared_ptr指向相同内存,shared_ptr析构之后内存释放,在使用之前使用函数lock()检查weak_ptr是否为空指针。

http://www.kler.cn/a/301681.html

相关文章:

  • 技术理论||02空中三角测量
  • 【网络安全】XSS注入
  • 论文笔记 SuDORMRF:EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION
  • 删除缓存之后,浏览器显示登录新设备
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,
  • 【nginx】client timed out和send_timeout的大小设置
  • Python学习笔记--类型、运算符、循环
  • 物联网之PWM呼吸灯、脉冲、LEDC
  • 【Linux】 LTG:移动硬盘部署Ubuntu24.04
  • vue 父组件给子组件传值
  • 基于深度学习的创新设计的生成AI
  • 哪一种反爬虫策略更加人性化,不让用户感知到
  • 02.06、回文链表
  • 离散制造与流程制造的差异分析
  • 熟悉Kafka组成模块、Kafka消息提交的方式及优缺点
  • 在js中观察者模式讲解
  • cross-plateform 跨平台应用程序-02-有哪些主流技术栈?
  • 123.rk3399 uboot(2017.09) 源码分析3(2024-09-12)
  • CSS中的位置定位总结
  • 《2024中国数据要素产业图谱2.0版》重磅发布
  • Java将Word文档转换为PDF文件常用方法总结
  • Android 系统下:普通应用无缝安装,Launcher 应用安装遭遇罕见障碍解析
  • route-forward springboot实现路由转发程序
  • 【C++开发中XML 文件的妙用】
  • Django+Vue协同过滤算法图书推荐系统的设计与实现
  • 【数字集成电路与系统设计】Chisel/Scala简介与Verilog介绍