为什么要有智能指针:
在C++中因为没有自动内存回收,自己开辟的空间总是要自己去维护 ,必须保证在出作用域或者程序运行完成退出之前释放掉自己申请的空间,否则就会造成内存泄漏的问题,这种问题防不胜防,在这样的情况下就催生出了智能指针,通过智能指针来解决这样的问题。
智能指针设计的思想:
资源分配即初始化:定义一个类来封装资源的分配和释放,在构造函数中完成资源的分配和初始化,在析构函数中实现资源的清理和汕尾,保证资源的正确初始化和释放
c++库中的智能指针auto_ptr,它的实现思想是每次只让一个对象对资源(也就是开辟的空间)拥有权限,当使用旧的对象创建新的对象时或者给新的对象赋值时,让旧的对象失去作用,只让新的对象拥有对资源的权限。
template <class T>
class AutoPtr
{
public :
AutoPtr(T* ptr)
:_ptr(ptr)
{}
//不能给出const类型的,因为在资源转移时,要将之前的对象置NULL
AutoPtr(AutoPtr<T>& ob)
{
if (_ptr)
{
Destroy();
}
_ptr = ob._ptr;
}
AutoPtr<T>& operator =(AutoPtr<T>& ob)
{
if (this != ob)
{
if (_ptr)
{
Destroy();
}
_ptr = ob._ptr;
return *this;
}
}
T& operator *()//返回所指向的对象
{
return *_ptr;
}
T* operator ->()//使用->调用智能指针对象的函数
{
return _ptr;
}
T* get()//获取裸指针
{
return _ptr;
}
~AutoPtr()
{
Destroy();
}
protected:
void Destroy()
{
if (_ptr)
{
delete _ptr;
_ptr = NULL;
}
}
private:
T* _ptr;
};
注意:因为使用旧的对象创建新的对象时或者给新的对象赋值时会使旧的对象失去作用,所以在拷贝构造和operator = 的参数列表中不能用const修饰
缺点:
1.资源的转移让之前的对象失去了作用。
2.不能用临时对象去创建新的对象(临时对象具有常性)例如:auto_ptr<int>p1(auto_ptr<int>(new int));
3.不能用值传递的方式调用对象。例如FunTest(ap);ap如果是一个auto_ptr的对象,在传递的时候会发生一次拷贝构造,会在函数中生成一个临时对象,造成ap失去对资源的权限变为无效对象,在函数执行完成后,临时对象被销毁资源也随着被销毁,造成意料之外的情况。
4.auto_ptr 使用的是delete 释放资源,所以不能使它指向数组。
建议:
auto_ptr的缺最好不要点使它在使用的时候难于掌握,所以最好不要使用auto_ptr