您的位置:首页 > 其它

ACE 智能指针

2015-11-20 13:41 281 查看
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;

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: