zoukankan      html  css  js  c++  java
  • 作用域指针(三)

    作用域指针

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

    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的情况下)。

    作用域指针和引用计数指针的使用差别在于,作用域指针不能被复制。它的拷贝构造函数和赋值操作符函数被声明为私有,因此不论什么试图复制这样的指针的代码都无法通过编译。这就消除了对指向同一个对象的同一个智能指针的多份拷贝进行计数的须要,由于它总是仅仅有一个,所以这样的指针并不须要再堆上分配一个整数对它的拷贝份数进行计数。由于这个原因。它的速度和普通的指针一样。

  • 相关阅读:
    aspx页面,中文乱码解决方案
    使用JSP体验微信公众平台开发模式
    使用微信公众平台“编辑模式”的过程记录
    JAVA刷新网站IP访问量的技术探讨
    301. Remove Invalid Parentheses
    Dungeon Game
    刷题关键点总结-动态规划
    刷题关键点总结-单调栈、单调队列
    coin change
    常用vim命令
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6846070.html
Copyright © 2011-2022 走看看