一、裸指针
(及其麻烦,用智能指针)
因为裸指针存在很多问题,主要是下面这些:
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的提领操作(解引用)就会出现问题。
总之就是:应用场景不明确,构造意义不明确,赋值意义不明确,资源会被重复释放。