c++学习笔记:智能指针

Q1.什么是智能指针?

简单理解就是能够自动释放内存的"指针"
注意,这里说的是指针,也就是普通指针,我们把它叫做原始指针,这一点很重要。也就是说,你可以你完全可以将它当作原始指针使用(当然拷贝操作例外),因为它重载了*与->运算符。

  • 智能指针离开作用域后会自动释放

Q2.智能指针有什么用,能解决什么问题?

它能帮助我们更有效、更安全的管理动态分配的内存,避免内存泄漏问题的发生。


Q3.智能指针

(1)智能指针的种类
1)、std::auto_ptr 已经被放弃

存在安全隐患

2)、独占指针:unique_ptr
  • 独占内存控制权,不能拷贝,即不能进行(=)赋值操作,只能通过move()函数来移交控制权。
//此操作将内存控制权移交tPtr1,tPtr将被释放,指向
//unique_ptr<Test> tPtr1 = tPtr; //错误! 不能拷贝
unique_ptr<Test> tPtr1 = std::move(tPtr);
3)、共享指针:shared_ptr
  • 共享指针,又称计数指针,可以被复制拷贝,每多一个拷贝的副本,计数器+1,当计数器为0时,自动释放该指针所托管的内存。
4)、unique_ptr 与 shared_ptr转换
  • unique_ptr 可直接转换为shared_ptr
  • shared_ptr不可转换为unique_ptr
5)、弱指针:weak_ptr

最重要的特性是:不享有内存释放的权限
*

(2)、创建方式

有三种创建方式,以unique_ptr为例,如下所示:

//方式1 【不推荐此方式】
Test ts = new Test();
unique_ptr<Test> tPtr(ts);	//创建智能指针
delete ts;
ts = nullptr;

//方式二 
unique_ptr<Test> tPtr(new Test()); //创建智能指针

//方式三 【推荐此方式,效率更高】
//创建智能指针,与普通指针new方法类似
//后面的() 为Test类的构造函数传参
unique_ptr<Test> tPtr = make_unique<Test>(); 

注意:独占指针的make_unique<>()是在c++14标准定义的,若编译时未指定使用c++14标准,将找不到此函数。

(3)、内部接口
  • reset():释放智能指针所托管的内存,并指向nullptr,他还有一个重载,参数为make_unique<>()。也就是释放原来的内存并托管新的内存
  • get():返回所托管的原始指针,即:Test *ts = tPtr.get();
  • release():释放对原始指针的托管,并将原始指针返回。这意味着这个被释放的原始指针将不会被自动释放,需要手动释放内存。

注意事项

  • 最好不要将智能指针定义为指针
 unique_ptr<Test> *tPtr = new unique_ptr<Test>(new Test());
  • 智能指针的接口都是通过 (.)运算符调用,而智能指针所托管的指针通过(->)运算符调用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值