一、指针管理的困境
-
资源释放了,指针没有置空
野指针:只有一个指针指向资源
指针悬挂:多个指针指向同一个资源
踩内存
-
没有释放资源,产生内存泄漏
-
重复释放资源,引发 coredump
二、如何解决?
-
智能指针采用了 RAIl 思想来自动化管理指针所指向的动态资源的释放
-
RAIl 主要利用了对象的生命周期来控制程序资源
-
智能指针利用类的构造函数和析构函数来管理资源
三、智能指针种类
1.shared_ptr
语义:共享所有权
资源没有明确的拥有者
原理:引用计数
场景:容器中管理指针;资源通过函数传递
使用规范:
- 使用shared ptr来管理动态资源的时候,不要使用原来的裸指针
构造智能指针的时候,不要暴露裸指针
尽量使用make_shared 来构造智能指针
不要通过 get 来操作裸指针
不要用一个指针构造多个智能指针对象 - 要用类对象指(this)作为 shared_ptr 返回
- 不能暴露裸指针
2.weak_ptr
辅助shared_ptr,用来解决 shared_ptr 循环引用,原因是弱引用不占用强引用计数
3.unique_ptr
语义:独享所有权
没有拷贝构造
没有赋值运算操作符
仅提供了移动构造,和移动赋值
明确某个对象只有一个拥有者
使用规范:
-
不支持拷贝,但是可以从函数中返回一个 unique_ptr
编译器优化
如果关闭编译器优化:有移动构造,调用移动构造;有拷贝构造,调用拷贝构造;没有拷贝构造,报错
-
make unique 但是 c++14 才提供
推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/VsFMs