首页 > 代码库 > 作用域指针(三)
作用域指针(三)
作用域指针
当我们并不打算复制智能指针,仅仅是想保证被分配的资源将被正确地回收,能够採用一种简单得多的解决方式:作用域指针。例如以下演示样例代码:
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的情况下)。
作用域指针和引用计数指针的使用差别在于,作用域指针不能被复制。它的拷贝构造函数和赋值操作符函数被声明为私有,因此不论什么试图复制这样的指针的代码都无法通过编译。这就消除了对指向同一个对象的同一个智能指针的多份拷贝进行计数的须要,由于它总是仅仅有一个,所以这样的指针并不须要再堆上分配一个整数对它的拷贝份数进行计数。由于这个原因。它的速度和普通的指针一样。
作用域指针(三)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。