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类型不同

 

4.大小

七.总结

1.智能指针目的防止内存泄露

2.auto_ptr被废弃是由于可能存在误用

(1)例子:可以由unique_ptr替代了

posted @ 2020-12-14 23:54  All_just_for_fun  阅读(152)  评论(0)    收藏  举报