4.智能指针
一.直接内存管理
1.不加圆括号的初始化形式
-
不叫括号的int类型值是不确定的
-
不加括号的类类型是通过初始化构造函数初始化
2.加圆括号的初始化形式
-
加括号的int类型值为0
-
加括号的类类型通过初始化构造函数初始化
3.使用new和auto配合初始化
4.new初始化const对象
5.new和delete使用注意事项
-
空指针可删除多次但是没有任何用处
-
delete多次出错
-
不是new出来的不能delete
二.new/delete浅谈
1.new/delete浅谈
-
new:先开辟空间,再初始化
-
delete:先将对象销毁,再销毁空间
2.operator new()和operator delete()函数
-
使用new和delete会调用这两个函数
3.delete如何知道销毁多少内存
4.new[]与delete[]
三.智能指针总述与shared_ptr
1.智能指针总述
-
auto_ptr:被淘汰不要使用
-
unique_ptr:独占指针
-
shared_ptr:共享指针
-
weak_ptr:弱指针,辅助shared_ptr指针
2.shared_ptr
(1)基础知识
(2)初始化方式
-
小括号初始化
-
裸指针初始化(不推荐)
-
make_shared函数初始化
3.shared_ptr引用计数
(1)引用计数增加
-
使用其他shared_ptr初始化,计数增加
-
作为形参值类型传入会函数中引用计数增加,最后如果没有作为返回值返回则出了函数引用计数减少
-
作为形参引用类型传入函数引用计数不会增加
-
作为返回值输出引用计数增加
(2)引用计数减少
4.shared_ptr常用函数
(1)use_count()
(2)unique()
(3)reset()
(4)*解引用
(5)get()
(6)swap()
(7)赋值nullptr
(8)智能指针名作为判断条件
5.删除器和数组问题
(1)指定删除器
(2)lambda表达式的删除器
(3)数组删除
-
普通类型
-
数组类型:不用定义删除器也能正常释放内存
-
类类型:可以自定义也可以使用default_delete删除
(4)由于不能使用make_shared函数自己封装
(5)注意事项
-
shared_ptr指向类型相同就是同一个类型,可以指定不同删除器
-
unique_ptr不相同
四.weak_ptr
1.简介
-
weak_ptr是shared_ptr的一个辅助,当shared_ptr释放weak_ptr也将不存在
2.weak_ptr的常用函数
(1)use_count()
(2)expired
(3)reset
(4)lock
3.weak_ptr大小
五.shared_ptr陷阱、性能分析以及建议
1.shared_ptr陷阱
(1)慎用裸指针
-
使用裸指针构造shared_ptr之后不要再使用那个裸指针
-
此处shared_ptr通过函数调用释放了裸指针,在对裸指针调用会报错
-
不要用裸指针初始化多次shared_ptr(此处无关联但多次释放裸指针)
(2)慎用get返回的指针
-
不要用delete删除get获得的裸指针
-
不要用get获得的裸指针初始化另一个智能指针(此处局部块中初始化,出块之后释放到时myp中的指针被释放了)
(3)用enable_shared_from_this返回this
-
错误做法:此处相当于将内部裸指针多次初始化智能指针多次释放会导致出错
-
正确做法:这样再次调用getself()函数就没有问题了
(4)避免循环引用
-
错误代码:对于其中pca和pcb相互引用导致存在两个强引用,最终不能释放
-
正确做法:让其中一个变为弱引用
2.shared_ptr性能分析
3.shared_ptr移动语义
4.shared_ptr补充说明
(1)shared_ptr使用分配器
(2)优先使用make_shared<xx>()
-
使用make_shared<xx>()会开辟足够大的内存一次
-
使用new方式先初始化类对象再初始化智能指针
(3)没有说过的不要乱用
六.unique_ptr基本操作
1.初始化
2.不支持复制与赋值但支持移动语义
3.release()
4.reset()
(1)不带参数
(2)带参数
5.=nullptr
6.指向数组
7.get()
8.*解引用
9.swap()
10.智能指针名做条件
11.unique_ptr转换为shared_ptr
-
unique_ptr无控制块
(1)unique_ptr做临时变量右值赋值给左值shared_ptr对象
(2)使用移动语义
12.返回unique_ptr、删除器和大小
(1)返回unique_ptr可以被赋值,不同的直接赋值和复制都不行
2.删除器
(1)格式(与shared_ptr不同)
(2)案例
-
typedef定义
-
using定义
-
decltype + typedef定义
-
直接decltype定义
-
lambda表达式定义
(3)指定删除器不同unique_ptr类型不同