1.智能指针解决内存泄漏的问题
1.1.智能指针是存储只想动态内存分配对象的指针类,用于生存期的控制,能够确保在离开指针所作用域时,自动正确的销毁动态分配的对象,防止内存泄漏
通过使用引用计数实现,使用一次增1,析构一次减1
1.2.三种智能指针
a.shared_ptr共享的智能指针
使用引用计数,每一个shared_ptr拷贝都指向一个相同的内存,最后一次析构释放
初始化
不能直接将原始指针赋值来初始化,只能通过构造函数和辅助方法来初始化
智能指针可以通过bool类型来判断指针是否为null
一个未初始化的智能指针可以通过reset方法初始化;当智能指针中有值的时候,用reset会使引用计数减1
获取原始指针
int* p = ptr.get()
指定删除器
当p引用计数为0时,自动调用删除器deleteIntPtr释放内存
当管理动态数组的时候,默认删除其不支持数组对象,需要指定
指定删除器delete[]
用default_delete作为删除器
通过封装make_shared_arry方法让shared_ptr支持数组
注意事项
不要用一个原始指针初始化多个shared_ptr
不要在函数的实参中创建shared_ptr
不要将this指针作为shared_ptr返回出来,要用shared_from_this()
原因enable_shared_from_this类中有一个weak_ptr,用来观测this智能指针,调用shared_from_this()时,会调用内部这个weak_ptr的lock方法
避免循环引用
b.unique_ptr独占的智能指针
是一个独占型的智能指针
不允许其他的智能指针共享内部的指针,也不允许通过赋值给另外一个,不允许复制
可以通过函数返回、move转移到其他unique_ptr中
unique_prt可以指向一个数组
指定删除器的时候需要确定删除器的类型
c.weak_ptr弱引用智能指针
是用来监视shared_ptr生命周期,不会使引用计数加1,不共享指针,不操作资源
基本用法
use_count()获得当前观测资源的引用计数
expired()方法判断所观测的资源是否已经被释放
lock方法获取所监视的shared_ptr
weak_ptr返回this指针
解决循环引用问题
其中一个成员变量改成weak_ptr就可以
1.3.通过智能指针管理第三方库分配的内存
ScopeGuard与GURAD的区别
ScopeGurad是确保能够正确的进行异常处理,没有异常,正常出函数作用域
GURAD是为了能在各种场景下正确释放内存,本质上是一个智能指针