ACE学习手记--- 智能指针(ACE_Auto_Ptr / ACE_Refcounted_Auto_Ptr)
来源:互联网 发布:薇诺娜淘宝上是正品吗 编辑:程序博客网 时间:2024/05/22 12:07
ACE库提供的智能指针的功能是相当强大的。主要有
ACE_Auto_Ptr
ACE_Refcounted_Auto_Ptr
ACE_Intrusive_Auto_Ptr
三个智能指针,其中用的比较多的却容易使用的是前面2个。最后一个需要在自己的类中实现一些规定的函数。在这里主要介绍前面2个指针的使用。
ACE_Auto_Ptr <X>
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 <typename X>
- 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<X> & ap);
- // 把 rhs所管理的原始指针的管理权限移交给本对象。如果本对象已经有管理的原始指针数据会先delete之前的指针
- ACE_Auto_Basic_Ptr<X> operator= (ACE_Auto_Basic_Ptr<X> & 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 <memory>
- #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 <typename X>
- class auto_ptr : public ACE_Auto_Basic_Ptr<X>
- {
- public:
- typedef X element_type;
- // = Initialization and termination methods
- explicit auto_ptr (X * p = 0) : ACE_Auto_Basic_Ptr<X> (p) {}
- auto_ptr (auto_ptr<X> & ap) : ACE_Auto_Basic_Ptr<X> (ap.release ()) {}
- X *operator-> () const;
- };
- template <typename X>
- class ACE_Auto_Ptr : public ACE_Auto_Basic_Ptr <X>
- {
- public:
- typedef X element_type;
- // = Initialization and termination methods
- explicit ACE_Auto_Ptr (X * p = 0) : ACE_Auto_Basic_Ptr<X> (p) {}
- // 得到原始指针 不可删除、但是可以修改指针所指向的数据。
- X *operator-> () const;
- };
- ACE学习手记--- 智能指针(ACE_Auto_Ptr / ACE_Refcounted_Auto_Ptr)
- ACE学习手记-----智能指针(ACE_Intrusive_Auto_Ptr)
- ACE学习手记-----智能指针(ACE_Intrusive_Auto_Ptr)
- ACE中智能指针
- ACE 智能指针
- ace 学习手记 20050829
- ACE学习手记-----ACE_Log_Msg
- ACE学习手记-----ACE_Log_Msg
- ACE笔记(8) -ACE智能指针
- ACE学习手记----ACE_INET_Addr类
- ACE学习手记 -----关于 ACE_CDR
- ACE笔记(8)-ACE智能指针
- 智能指针:boost学习
- 智能指针学习
- C++ 智能指针学习
- Qt 智能指针学习
- Boost智能指针学习
- 智能指针学习
- nm命令用法
- 剧本翻译之SHUFFLE 6月15日
- VC++6.0调试篇:远程调试续--DLL篇
- 无法添加选择的web部件
- 第6章 装饰模式
- ACE学习手记--- 智能指针(ACE_Auto_Ptr / ACE_Refcounted_Auto_Ptr)
- java修饰符权限
- gcc编译文件时找不到指定函数怎么办
- 利用多核多线程进行程序优化
- MFC的派生类多根继承时,为什么必须将MFC类作为第一父类
- VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL, NULL, NULL)); 老是出错
- java配置环境变量
- 软件项目中的风险识别的思考
- 如何在Windows的cmd下让程序在后台执行