1. 程式人生 > >作用域指針(三)

作用域指針(三)

cit release 方式 con 例如 操作符 clas scopedptr typename

作用域指針

當我們並不打算復制智能指針,僅僅是想保證被分配的資源將被正確地回收,能夠採用一種簡單得多的解決方式:作用域指針。例如以下演示樣例代碼:

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

作用域指針和引用計數指針的使用差別在於,作用域指針不能被復制。它的拷貝構造函數和賦值操作符函數被聲明為私有,因此不論什麽試圖復制這樣的指針的代碼都無法通過編譯。這就消除了對指向同一個對象的同一個智能指針的多份拷貝進行計數的須要,由於它總是僅僅有一個,所以這樣的指針並不須要再堆上分配一個整數對它的拷貝份數進行計數。由於這個原因。它的速度和普通的指針一樣。

作用域指針(三)