ACE 智能指針

ACE庫提供的智能指針的功能是相當強大的。主要有
ACE_Auto_Ptr
ACE_Refcounted_Auto_Ptr
ACE_Intrusive_Auto_Ptr
三個智能指針,其中用的比較多的卻容易使用的是前面2個。最後一個需要在自己的類中實現一些規定的函數。在這裏主要介紹前面2個指針的使用。
 
ACE_Auto_Ptr
 
ACE_Auto_Ptr 更像RAII的應用一樣。資源初始化即獲取及其釋放的C++慣用手法。也即ACE_Auto_Ptr 會擁有一個指向X對象的指針,並且在ACE_Auto_Ptr 退出作用於(生命期結束)時會自動是否X指針的資源。
如果在用戶的應用程序不想刪除X對象的指針,那麼必須在ACE_Auto_Ptr 生命期結束時必須自己手動release掉X對象的指針。
ACE_Auto_Ptr不是基於引用計數的。當把一個ACE_Auto_Ptr對象賦值給另外一個ACE_Auto_Ptr對象時X對象的指針的所有權會發生轉移。也就是X對象的指針有且僅有一個ACE_Auto_Ptr可以擁有該指針。
 
 
ACE_Refcounted_Auto_Ptr 是一個基於引用技術的智能指針,多個ACE_Refcounted_Auto_Ptr對象可以指向同一個X對象的指針。該智能指針提供的功能和ACE_Auto_Ptr大體相當。不同之處在於何時刪除 智能指針所管理的X對象的指針。
在所有執行同一個X對象指針的ACE_Refcounted_Auto_Ptr 對象生命期結束時,才刪除X對象的指針。
/** 
 * @class ACE_Auto_Basic_Ptr 
 * 
 * @brief Implements the draft C++ standard auto_ptr abstraction. 
 * This class allows one to work on non-object (basic) types 
 */ 
template 
class ACE_Auto_Basic_Ptr 

public: 
  typedef X element_type;
  // = Initialization and termination methods 
  // = 初始化一個智能指針對象,該只能指針管理這個指針p指向的數據。 
  explicit ACE_Auto_Basic_Ptr (X * p = 0) : p_ (p) {}
    // 把智能指針ap所管理的指針數據移交給新的智能指針對象。ap不再擁有對原始指針的管理權限。 
  ACE_Auto_Basic_Ptr (ACE_Auto_Basic_Ptr & ap); 
  // 把 rhs所管理的原始指針的管理權限移交給本對象。如果本對象已經有管理的原始指針數據會先delete之前的指針 
  ACE_Auto_Basic_Ptr operator= (ACE_Auto_Basic_Ptr & rhs); 
  // 釋放智能指針對象所管理的原始指針、調用底層的delete/free函數刪除指針數據 
  ~ACE_Auto_Basic_Ptr (void);
  // = Accessor methods. 
  // 得到原始指針的數據的引用 
  X operator *() const; 
  // 得到原始指針,不可刪除該指針、但是可以修改指針所執行的數據。 
  X *get (void) const; 
  // 得到原始指針、智能指針對象不再擁有對該指針的管理權限。與get不相同 
  // 需要用戶自己管理X*指針變量的生命期。 
  X *release (void); 
   
  // 與 operator=一樣。會刪除掉原先擁有的指針數據 
  void reset (X * p = 0);
  /// Dump the state of an object. 
  void dump (void) const;
  /// Declare the dynamic allocation hooks. 
  ACE_ALLOC_HOOK_DECLARE;
protected: 
  X *p_; 
};
ACE_END_VERSIONED_NAMESPACE_DECL
#if !defined (ACE_LACKS_AUTO_PTR) && \ 
     defined (ACE_HAS_STANDARD_CPP_LIBRARY) && \ 
            (ACE_HAS_STANDARD_CPP_LIBRARY != 0) 
#include 
#if defined (ACE_USES_STD_NAMESPACE_FOR_STDCPP_LIB) && \ 
            (ACE_USES_STD_NAMESPACE_FOR_STDCPP_LIB != 0) 
using std::auto_ptr; 
#endif /* ACE_USES_STD_NAMESPACE_FOR_STDCPP_LIB */ 
#else /* ACE_HAS_STANDARD_CPP_LIBRARY */
/** 
 * @class auto_ptr 
 * 
 * @brief Implements the draft C++ standard auto_ptr abstraction. 
 */ 
template 
class auto_ptr : public ACE_Auto_Basic_Ptr 

public: 
  typedef X element_type;
  // = Initialization and termination methods 
  explicit auto_ptr (X * p = 0) : ACE_Auto_Basic_Ptr (p) {} 
  auto_ptr (auto_ptr & ap) : ACE_Auto_Basic_Ptr (ap.release ()) {}
  X *operator-> () const; 
};
 
template 
class ACE_Auto_Ptr : public ACE_Auto_Basic_Ptr 

public: 
  typedef X element_type;
  // = Initialization and termination methods 
  explicit ACE_Auto_Ptr (X * p = 0) : ACE_Auto_Basic_Ptr (p) {}
  // 得到原始指針 不可刪除、但是可以修改指針所指向的數據。 
  X *operator-> () const; 
};
發佈了121 篇原創文章 · 獲贊 51 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章