作用域指针(三)

作用域指针

当我们并不打算复制智能指针,只是想保证被分配的资源将被正确地回收,可以采用一种简单得多的解决方案:作用域指针。如下示例代码:

template <typename T>
class ScopedPtr
{
public:
	explicit ScopedPtr(T* p = NULL)
		:ptr_(p)
	{
	}

	ScopedPtr<T>& operator=(T* p)
	{
		if(ptr_ != p)
		{
			delete ptr_;
			ptr_ = p;
		}
		return *this;
	}

	~ScopedPtr()
	{
		delete ptr_;
	}
	T* Get() const
	{
		return ptr_;
	}

	T* operator->()const
	{
		SCPP_TEST_ASSERT(ptr_ != NULL,
			"Attempt to use operator -> on NULL pointer.");
		return ptr_;
	}

	T& operator*()const
	{
		SCPP_TEST_ASSERT(ptr_ != NULL,
			"Attempt to use operator * on NULL pointer.");
		return *ptr_;
	}

	//把所有对象的所有权释放给调用者
	T* Release()
	{
		T* p = ptr_;
		ptr_ = NULL;
		return p;
	}

private:
	T* ptr_;

	//复制被禁止
	ScopedPtr(const ScopedPtr<T>& rhs);
	ScopedPtr<T>& operator=(const ScopedPtr<T>& rhs);
};

同样,这个类的最重要属性是它的析构函数删除它所指向的对象(即不是在NULL的情况下)。作用域指针和引用计数指针的使用区别在于,作用域指针不能被复制。它的拷贝构造函数和赋值操作符函数被声明为私有,因此任何试图复制这种指针的代码都无法通过编译。这就消除了对指向同一个对象的同一个智能指针的多份拷贝进行计数的需要,因为它总是只有一个,所以这种指针并不需要再堆上分配一个整数对它的拷贝份数进行计数。由于这个原因,它的速度和普通的指针一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值