C++智能指针(C++ primer,P667)

智能指针

  • 智能指针是什么
  • auto_ptr
  • 智能指针使用注意事项
  • unique_ptr
  • shared_ptr
  • 如何选择智能指针

智能指针是什么

智能指针是指:行为类似于指针的类对象

核心思想:它是一个类对象,对象过期时,对象的析构函数会自动被调用删除指针指向的内存;

auto_ptr

以auto_ptr为例使用智能指针,其余两个(实际是三个)智能指针使用方法与auto_ptr类似。

#include <iostream>
#include <string>
//需要包含下面头文件
#include <memory>
using namespace std;

auto_ptr<double> pd(new double(1.0));
auto_ptr<string> pa(new string("abcde"));

//应避免以下的行为
//后面的括号中只能是动态申请的地址
//否则在执行析构函数时会出错(释放非堆空间)
string s("abcde");
auto_ptr<string> pc(&s);

智能指针括号中,只能是动态分配的地址;否则析构时会释放非堆空间,导致程序崩溃。

智能指针使用注意事项

当两个智能指针指向同一个地址时,执行两次析构函数,会导致释放过地址再次被释放,致使程序崩溃。

解决办法:

  • 重载赋值运算符,进行深拷贝;
  • 建立所有权概念;若a = b,则b丧失对地址的所有权;
  • 创建更智能的指针,跟踪引用指针的次数并记录,仅当此时为1时析构才释放指针空间;

auto_ptr、unique_ptr都是采用所有权概念;
shared_ptr是采用更智能方式,记录次数;

unique_ptr

使用方法与auto_ptr相同,但是需要注意,

  • unique_ptr重载了new[] / delete[],而auto不能申请动态数组;
  • 当 p2 = p1所有权发生变更时,unique会报错(编译时错误优于运行时错误)
  • 若将一个右值指针的所有权交割unique不会报错

shared_ptr

使用方法与auto_ptr相同,但是需要注意,它采用计数形式析构,只有最后一次析构才会释放空间;

选用哪个指针

  • 程序若使用多个指针指向一个对象,则使用shared_ptr
  • 否则,推荐使用unique_ptr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值