scoped_ptr是Boost库中的一个智能指针,它和auto_ptr非常类似,可以完成资源的自动释放。scoped_ptr与auto_ptr的区别在于,auto_ptr可以实现资源的转移,但是scoped_ptr禁止了资源的转移,它让一个对象拥有了对资源的彻底掌控。
下面代码模拟实现了scoped_ptr:
template <class T>
class ScopedPtr
{
public:
ScopedPtr(T* ptr)
:_ptr(ptr)
{}
T& operator *()//返回所指向的对象
{
return *this;
}
T* operator ->()//使用->调用智能指针对象的函数
{
return _ptr;
}
T* get()//获取裸指针
{
return _ptr;
}
~AutoPtr()
{
Destroy();
}
protected:
void Destroy()
{
if (_ptr)
{
delete _ptr;
_ptr = NULL;
}
}
private:
ScopedPtr(ScopedPtr<T>& ob);
ScopedPtr<T>& operator =(ScopedPtr<T>& ob);
T* _ptr;
};
注意:要禁止资源的转移,所以将它的拷贝构造函数和复制运算符的重载都给成私有的,这样就防止了资源的转移
缺点:
- 不能转换权限
scoped_ptr所管理的对象生命周期仅仅局限于一个区间(该指针所在的"{}"之间),无法传到区间之外,这就意味着scoped_ptr对象是不能作为函数的返回值的(auto_ptr可以)。 -
不能共享所有权
这个特点使得该指针简单易用,但是造成了指针功能的薄弱,让它不能用于stl的容器中。 -
不能用于管理数组对象
由于scoped_ptr是通过delete来删除所管理对象,所以不能管理数组对象。
Boost库中给出了scoped_array进行对new[] 申请出来的空间进行管理。它的实现原理和scoped_ptr是一样的。
下面的代码是模拟实现scoped_array:
template <class T>
class ScopedArray
{
public:
ScopedArray()
{}
ScopedArray(T* ptr)
:_ptr(ptr)
{}
T* get()//获取裸指针
{
return _ptr;
}
T& operator [](int num)const
{
return _ptr[num];
}
~ScopedArray()
{
Destroy();
}
protected:
void Destroy()
{
if (_ptr)
{
delete[] _ptr;
_ptr = NULL;
}
}
private:
ScopedArray(ScopedArray<T>& ob);
ScopedArray<T>& operator =(ScopedArray<T>& ob);
T* _ptr;
};
scoped_array和scoped_ptr的不同:
-
scoped_array构造函数接受的必须是 new[]的结果,scoped_ptr构造函数接受的必须是 new的结果
-
scoped_array必须使用delete[]释放资源,scoped_ptr必须使用delete释放资源
-
scoped_array没有 *和->这两个操作符的重载,它是一个指向一段空间的指针
-
scoped_array提供了[]的重载,可以像普通数组一样使用下标访问
注意:虽然Boost库中有scoped_array这个只能指针,不过最好在需要动态分配数组时使用vector来完成
vector可以实现任意类型的动态数组,而且他有丰富的成员函数来操作数据,易于维护。而对于scoped_array来说,它仅仅是对指针的管理,不能动态增长也没有迭代器支持,相对来说难于使用。