歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

一個C++中智能指針的設計

在C++中,智能指針是存儲一些動態分配對象或者資源的類,主要用於控制資源或者動態對象的使用生存期,設計的目的如下:

  1. 保證能夠正確的分配和銷毀動態對象或者資源,以防止內存洩露等問題。
  2. 跟蹤對象或者資源的使用情況。

智能指針的實現一般都是使用引用計數,將一個計數器與使用的指針相關聯起來,此時引用計數器跟蹤該所屬類有外部多少共享。因此在實現的時候,就有兩個根本的部分

  1. 計數表示。用於實現對動態對象或者資源使用的計數。
  2. 指針表示。用於將動態對象或者資源的指針使用間接表現。

根據智能指針主要是上面兩大部分,智能指針可以稱為“智能計數指針”,智能主要是計數的意思,當然計數的用途就因應用而不同了,或者只是為了跟蹤,或者是為了資源管理,或者是為了防止多次釋放等等。

一,智能指針實現

下面的模板類,用於實現對指針的封裝,其實現的功能如下:

  1. 指針構造。根據需要被封裝的動態對象或者資源的指針,構造智能指針,一般在構造時,會將資源的計數加1;
  2. 指針運算符重載。下面重載了*,=,->等運算符。
  3. 指針數據。一個指向模板類型的指針,T* ptr_
  1. template <class T> 
  2. class scoped_refptr { 
  3.  public
  4.   scoped_refptr() : ptr_(NULL) { 
  5.   } 
  6.  
  7.   scoped_refptr(T* p) : ptr_(p) { 
  8.     if (ptr_) 
  9.       ptr_->AddRef(); 
  10.   } 
  11.  
  12.   scoped_refptr(const scoped_refptr<T>& r) : ptr_(r.ptr_) { 
  13.     if (ptr_) 
  14.       ptr_->AddRef(); 
  15.   } 
  16.  
  17.   template <typename U> 
  18.   scoped_refptr(const scoped_refptr<U>& r) : ptr_(r.get()) { 
  19.     if (ptr_) 
  20.       ptr_->AddRef(); 
  21.   } 
  22.  
  23.   ~scoped_refptr() { 
  24.     if (ptr_) 
  25.       ptr_->Release(); 
  26.   } 
  27.  
  28.   T* get() const { return ptr_; } 
  29.   operator T*() const { return ptr_; } 
  30.   T* operator->() const { return ptr_; } 
  31.  
  32.   T* release() { 
  33.     T* retVal = ptr_; 
  34.     ptr_ = NULL; 
  35.     return retVal; 
  36.   } 
  37.  
  38.   scoped_refptr<T>& operator=(T* p) { 
  39.     // AddRef first so that self assignment should work  
  40.     if (p) 
  41.       p->AddRef(); 
  42.     if (ptr_ ) 
  43.       ptr_ ->Release(); 
  44.     ptr_ = p; 
  45.     return *this
  46.   } 
  47.  
  48.   scoped_refptr<T>& operator=(const scoped_refptr<T>& r) { 
  49.     return *this = r.ptr_; 
  50.   } 
  51.  
  52.   template <typename U> 
  53.   scoped_refptr<T>& operator=(const scoped_refptr<U>& r) { 
  54.     return *this = r.get(); 
  55.   } 
  56.  
  57.   void swap(T** pp) { 
  58.     T* p = ptr_; 
  59.     ptr_ = *pp; 
  60.     *pp = p; 
  61.   } 
  62.  
  63.   void swap(scoped_refptr<T>& r) { 
  64.     swap(&r.ptr_); 
  65.   } 
  66.  
  67.  protected
  68.   T* ptr_; 
  69. }; 

有了這個類之後,我們可以定義一個指針,如針對class window的智能指針

scoped_refptr<window> win; 

此時,上面的模板就會包含一個window *ptr_的指針,從上面可以看出,為了能夠正常工作,這類型的指針都必須要實現AddRef和Release方法,這應該不會是要求在class window中實現的吧?那也不太不符合封裝的正常邏輯了。答案是:當然不會在class window中實現,這兩個方法主要是針對計數的方法,專門針對class window封裝一個計數器類,下面的計數器封裝。

Copyright © Linux教程網 All Rights Reserved