智能指针 、auto_ptr

一、裸指针

(及其麻烦,用智能指针)
因为裸指针存在很多问题,主要是下面这些:
1.难以区分指向的是单个对象还是一个数组;
⒉.使用完指针之后无法判断是否应该销毁指针,因为无法判断指针是否"拥有”指向的对象;
3.在已经确定需要销毁指针的情况下,也无法确定是用delete关键字删除,还是有其他特殊的销毁机制,例如通过将指针传入某个特定的销毁函数来销毁指针;
4.即便已经确定了销毁指针的方法,由于1的原因,仍然无法确定到底是用delete(销毁单个对象)还是delete](销毁一个数组);5.假设上述的问题都解决了,也很难保证在代码的所有路径中(分支结构,异常导致的跳转),有且仅有一次销毁指针操作;任何一条路径遗漏都可能导致内存泄露,而销毁多次则会导致未定义行为;
6.理论上没有方法来分辨一个指针是否处于悬挂状态;

int *p;
Object *op;
如:
在这里插入图片描述

RAII(资源获取即初始化)

在这里插入图片描述
整个过程无需人工介入,由操作系统自动完成;于是,很自然联想到,当我们在使用资源的时候,在构造函数中进行初始化,在析构函数中进行销毁。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

auto_ptr

在这里插入图片描述
解释:在fun函数中,定义了一个智能指针op,首先构造函数对其进行构造,return之前,析构函数对其进行析构,来完成内存的自动管理。首先,程序为op开辟一个栈帧,里面有_Owns和_Ptr两个成员,new一个对象,将_Ptr指向新对象,析构函数(如果有资源所有权,delete掉)

object对象如何使用?

1.重载->,*两个符号,使对象具有指针的特性
在这里插入图片描述
二者等价
在这里插入图片描述

op是一个auto_ptr类的对象。op.是调用对象的方法,op->是运算符的重载

2.重置指针
在这里插入图片描述
如果拥有资源,释放掉,重新指向新的资源
在这里插入图片描述
释放资源
在这里插入图片描述
在这里插入图片描述
此写法,编译不通过,常方法下进行不了赋值操作

常方法中,如何操作使得我们可以操作对象的属性?

在这里插入图片描述
方法一:使用异变关键字 mutable,由这个关键字修饰的属性,在常方法中
也可以被修改,不受const的限制。
在这里插入图片描述
方法二:去常性
在这里插入图片描述
方法三:对this指针下手
在这里插入图片描述在这里插入图片描述
所以修改如下:
在这里插入图片描述
交换资源

在这里插入图片描述

为什么auto_ptr被C++11舍弃?

(1)当两个auto_ptr指向同一个对象的时候,当一个auto_ptr被析构的时候,另一个再次析构的时候会出错。
(2)当对象是数组的时候,析构的时候会出现问题。因为auto_ptr是delete,不是delete[];
(3)当auto_ptr被拷贝或者赋值之后,它会失去对资源的所有权,如果在这之后对auto_ptr的提领操作(解引用)就会出现问题。
总之就是:应用场景不明确,构造意义不明确,赋值意义不明确,资源会被重复释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值