c++智能指针
文章目录
为什么要有智能指针?
c++最令人失望的是没有资源回收功能,资源的回收依赖于显示定义的回收资源的函数。为了实现资源的自动回收,c++引入了一种能够近似自动回收的方法就是智能指针。
智能指针是基于一种叫做 RAII 的思想,(Resource Acquisition Is Initialization) 将资源的回收在定义变量的时候就设置好。智能指针的作用其实就是将资源的管理分配给每一个对象,随着对象的消亡而调用析构函数然后将资源粉碎掉。
这样做的好处是:
1.不需要显示的释放资源
2.采用这种方式,对象所需的资源在其生命周期内始终有效。
智能指针有哪些实现版本
智能指针不应该只是一个对象,它还应该能够干指针能干的事情,比如说 * 解引用
和 -> 箭头,如果有需要的话还必须有 = 号功能。也就是说要对这些功能进行函数重载。
auto_ptr 的实现版本1
template <class T>
class AutoPtr
{
private:
T* _Ptr;
public:
AutoPtr(T *ptr = nullptr) :_Ptr(ptr)
{
}
AutoPtr(const AutoPtr<T> &ap) :_Ptr(ap._Ptr)
{
ap._Ptr = nullptr;
}
AutoPtr<T> &operator = (const AutoPtr<T> &ap)
{
if (this != &ap)
{
delete this->_Ptr;
this->_Ptr = ap._Ptr;
ap._Ptr = nullptr;
}
return *this;
}
~AutoPtr()
{
delete _Ptr;
}
T& operator *()
{
if (_Ptr == nullptr)
{
throw ap;
}
return *_Ptr;
}
T& operator ->()
{
if (_Ptr == nullptr)
{
throw ap;
}
return _Ptr;
}
};
以上auto_ptr的主要思想是,
1.资源只能被一个指针管理
2.如果使用一个管理了资源的指针去初始化另一个指针的话。那么管理资源的权限将会被转移。
3.转移过后的指针将会被赋予nullptr。也就是被悬空了。
以上存在的问题,如果空指针被错误的解引用会造成程序崩溃。
auto_ptr 的实现版本2
为了使得多个职能指针共同使用同一块空间,在以上的基础上做了一点改变。设立一个owner的bool变量,只有为true的owner才能够释放资源。使用拷贝构造函数或者赋值运算符时,会造成管理权限的转移。
template <class T>
class Auto_ptr{
private:
mutable T * _ptr;
mutable bool owner;
public:
Auto_ptr(T *ptr = nullptr) :_ptr(ptr), owner(true)
{
}
Auto_ptr(const Auto_ptr & ap) :_ptr(ap._ptr), owner(true)
{
if (this != &ap)
{
ap.owner = false;
}
}
Auto_ptr<T> & operator = (const Auto_ptr & ap)
{
if (this != &ap)
{