关于scoped_ptr和scoped_array

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;
};
注意:要禁止资源的转移,所以将它的拷贝构造函数和复制运算符的重载都给成私有的,这样就防止了资源的转移

缺点:
  1. 不能转换权限
    scoped_ptr所管理的对象生命周期仅仅局限于一个区间(该指针所在的"{}"之间),无法传到区间之外,这就意味着scoped_ptr对象是不能作为函数的返回值的(auto_ptr可以)。
  2. 不能共享所有权
    这个特点使得该指针简单易用,但是造成了指针功能的薄弱,让它不能用于stl的容器中。
  3. 不能用于管理数组对象
    由于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来说,它仅仅是对指针的管理,不能动态增长也没有迭代器支持,相对来说难于使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值