CAutoPtr

此类表示智能指针对象。

重要

无法在 Windows 运行时中执行的应用程序中使用此类及其成员。

语法

template <typename T>
class CAutoPtr

参数

T
指针类型。

成员

公共构造函数

名称 描述
CAutoPtr::CAutoPtr 构造函数。
CAutoPtr::~CAutoPtr 析构函数。

公共方法

名称 描述
CAutoPtr::Attach 调用此方法以获取现有指针的所有权。
CAutoPtr::Detach 调用此方法可释放指针的所有权。
CAutoPtr::Free 调用此方法以删除由 CAutoPtr 指向的对象。

公共运算符

“属性” 描述
CAutoPtr::operator T* 强制转换运算符。
CAutoPtr::operator = 赋值运算符。
CAutoPtr::operator -> 指向成员的指针的运算符。

公共数据成员

“属性” 描述
CAutoPtr::m_p 指针数据成员变量。

注解

此类提供用于创建和管理映射对象的方法。 智能指针有助于防止内存泄漏,方法是在资源超出范围时自动释放资源。

此外,CAutoPtr 的复制构造函数和赋值运算符转移指针的所有权,将源指针复制到目标指针,并将源指针设置为 NULL。 这就是为什么不可能有两 CAutoPtr 个对象每个存储同一个指针的原因,并减少了删除同一指针两次的可能性。

CAutoPtr 还简化了指针集合的创建。 创建 CAutoPtr 对象的集合更简单,而不是派生集合并重写析构函数。 删除集合后,CAutoPtr 对象将超出范围并自动删除自身。

CHeapPtr 和变体的工作方式与 CAutoPtr 相同,使用不同的堆函数(而不是 C++ newdelete 运算符)分配和释放内存除外。 CAutoVectorPtrCAutoPtr 类似,唯一不同的是它使用向量 new[]向量 delete[] 分配和释放内存。

有关何时需要智能指针的数组或列表,另请参阅 CAutoPtrArray 以及 CAutoPtrList

要求

标头:atlbase.h

示例

// A simple class for demonstration purposes

class MyClass 
{
   int iA;
   int iB;
public:
   MyClass(int a, int b);
   void Test();
};

MyClass::MyClass(int a, int b)
{
   iA = a;
   iB = b;
}

void MyClass::Test()
{
   ATLASSERT(iA == iB);
}

// A simple function

void MyFunction(MyClass* c)
{
   c->Test();
}

int UseMyClass()
{
   // Create an object of MyClass.
   MyClass *pMyC = new MyClass(1, 1);

   // Create a CAutoPtr object and have it take
   // over the pMyC pointer by calling Attach.
   CAutoPtr<MyClass> apMyC;
   apMyC.Attach(pMyC);

   // The overloaded -> operator allows the 
   // CAutoPtr object to be used in place of the pointer.
   apMyC->Test();

   // Assign a second CAutoPtr, using the = operator.
   CAutoPtr<MyClass> apMyC2;
   apMyC2 = apMyC;

   // The casting operator allows the
   // object to be used in place of the pointer.
   MyFunction(pMyC);
   MyFunction(apMyC2);

   // Detach breaks the association, so after this
   // call, pMyC is controlled only by apMyC.
   apMyC2.Detach();

   // CAutoPtr destroys any object it controls when it
   // goes out of scope, so apMyC destroys the object 
   // pointed to by pMyC here.
   return 0;
}

CAutoPtr::Attach

调用此方法以获取现有指针的所有权。

void Attach(T* p) throw();

参数

p
CAutoPtr 对象将获取此指针的所有权。

备注

CAutoPtr 对象获取指针的所有权时,它将在超出范围时自动删除指针和任何已分配的数据。 如果调用 CAutoPtr::Detach,程序员将再次负责释放任何已分配的资源。

在调试版本中,如果 CAutoPtr::m_p 数据成员当前指向现有值,则会发生断言失败;也就是说,它不等于 NULL。

示例

请参阅CAutoPtr概述中的示例。

CAutoPtr::CAutoPtr

构造函数。

CAutoPtr() throw();
explicit CAutoPtr(T* p) throw();

template<typename TSrc>
CAutoPtr(CAutoPtr<TSrc>& p) throw();

template<>
CAutoPtr(CAutoPtr<T>& p) throw();

参数

p
现有指针。

TSrc
由另一个 CAutoPtr 管理的类型,用于初始化当前对象。

备注

CAutoPtr 对象可以使用现有指针创建,在这种情况下,它将转移指针的所有权。

示例

请参阅CAutoPtr概述中的示例。

CAutoPtr::~CAutoPtr

析构函数。

~CAutoPtr() throw();

备注

释放任何已分配的资源。 调用 CAutoPtr::Free

CAutoPtr::Detach

调用此方法可释放指针的所有权。

T* Detach() throw();

返回值

返回对象的副本。

备注

释放指针的所有权,将 CAutoPtr::m_p 数据成员变量设置为 NULL,并返回指针的副本。 调用 Detach 后,由程序员来释放任何分配的资源,CAutoPtr 对象之前通过该资源承担了责任。

示例

请参阅CAutoPtr概述中的示例。

CAutoPtr::Free

调用此方法以删除由 CAutoPtr 指向的对象。

void Free() throw();

备注

释放 CAutoPtr 指向的对象,CAutoPtr::m_p 数据成员变量设置为 NULL。

CAutoPtr::m_p

指针数据成员变量。

T* m_p;

注解

此成员变量保存指针信息。

CAutoPtr::operator =

赋值运算符。

template<>
CAutoPtr<T>& operator= (CAutoPtr<T>& p);

template<typename TSrc>
CAutoPtr<T>& operator= (CAutoPtr<TSrc>& p);

参数

p
指针。

TSrc
类类型。

返回值

返回对 CAutoPtr< T > 的引用。

备注

赋值运算符将 CAutoPtr 对象与任何当前指针分离,并将新指针 p 附加到其位置。

示例

请参阅CAutoPtr概述中的示例。

CAutoPtr::operator ->

指向成员的指针的运算符。

T* operator->() const throw();

返回值

返回 CAutoPtr::m_p 数据成员变量的值。

备注

使用此运算符调用 CAutoPtr 对象指向的类中的方法。 在调试版本中,如果 CAutoPtr 指向 NULL,将发生断言失败。

示例

请参阅CAutoPtr概述中的示例。

CAutoPtr::operator T*

强制转换运算符。

operator T* () const throw();

返回值

返回指向类模板中定义的对象数据类型的指针。

示例

请参阅CAutoPtr概述中的示例。

另请参阅

CHeapPtr
CAutoVectorPtr
类概述