歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 一個C++中智能指針的設計

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

日期:2017/3/1 10:06:25   编辑:Linux編程

在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. scoped_refptr(T* p) : ptr_(p) {
  7. if (ptr_)
  8. ptr_->AddRef();
  9. }
  10. scoped_refptr(const scoped_refptr<T>& r) : ptr_(r.ptr_) {
  11. if (ptr_)
  12. ptr_->AddRef();
  13. }
  14. template <typename U>
  15. scoped_refptr(const scoped_refptr<U>& r) : ptr_(r.get()) {
  16. if (ptr_)
  17. ptr_->AddRef();
  18. }
  19. ~scoped_refptr() {
  20. if (ptr_)
  21. ptr_->Release();
  22. }
  23. T* get() const { return ptr_; }
  24. operator T*() const { return ptr_; }
  25. T* operator->() const { return ptr_; }
  26. T* release() {
  27. T* retVal = ptr_;
  28. ptr_ = NULL;
  29. return retVal;
  30. }
  31. scoped_refptr<T>& operator=(T* p) {
  32. // AddRef first so that self assignment should work
  33. if (p)
  34. p->AddRef();
  35. if (ptr_ )
  36. ptr_ ->Release();
  37. ptr_ = p;
  38. return *this;
  39. }
  40. scoped_refptr<T>& operator=(const scoped_refptr<T>& r) {
  41. return *this = r.ptr_;
  42. }
  43. template <typename U>
  44. scoped_refptr<T>& operator=(const scoped_refptr<U>& r) {
  45. return *this = r.get();
  46. }
  47. void swap(T** pp) {
  48. T* p = ptr_;
  49. ptr_ = *pp;
  50. *pp = p;
  51. }
  52. void swap(scoped_refptr<T>& r) {
  53. swap(&r.ptr_);
  54. }
  55. protected:
  56. T* ptr_;
  57. };

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

scoped_refptr<window> win;

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

Copyright © Linux教程網 All Rights Reserved