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++ new
和 delete
运算符)分配和释放内存除外。 CAutoVectorPtr
与 CAutoPtr
类似,唯一不同的是它使用向量 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;
}
调用此方法以获取现有指针的所有权。
void Attach(T* p) throw();
p
CAutoPtr
对象将获取此指针的所有权。
当 CAutoPtr
对象获取指针的所有权时,它将在超出范围时自动删除指针和任何已分配的数据。 如果调用 CAutoPtr::Detach
,程序员将再次负责释放任何已分配的资源。
在调试版本中,如果 CAutoPtr::m_p
数据成员当前指向现有值,则会发生断言失败;也就是说,它不等于 NULL。
请参阅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() throw();
释放任何已分配的资源。 调用 CAutoPtr::Free
。
调用此方法可释放指针的所有权。
T* Detach() throw();
返回对象的副本。
释放指针的所有权,将 CAutoPtr::m_p
数据成员变量设置为 NULL,并返回指针的副本。 调用 Detach
后,由程序员来释放任何分配的资源,CAutoPtr
对象之前通过该资源承担了责任。
请参阅CAutoPtr
概述中的示例。
调用此方法以删除由 CAutoPtr
指向的对象。
void Free() throw();
释放 CAutoPtr
指向的对象,CAutoPtr::m_p
数据成员变量设置为 NULL。
指针数据成员变量。
T* m_p;
此成员变量保存指针信息。
赋值运算符。
template<>
CAutoPtr<T>& operator= (CAutoPtr<T>& p);
template<typename TSrc>
CAutoPtr<T>& operator= (CAutoPtr<TSrc>& p);
p
指针。
TSrc
类类型。
返回对 CAutoPtr< T >
的引用。
赋值运算符将 CAutoPtr
对象与任何当前指针分离,并将新指针 p
附加到其位置。
请参阅CAutoPtr
概述中的示例。
指向成员的指针的运算符。
T* operator->() const throw();
返回 CAutoPtr::m_p
数据成员变量的值。
使用此运算符调用 CAutoPtr
对象指向的类中的方法。 在调试版本中,如果 CAutoPtr
指向 NULL,将发生断言失败。
请参阅CAutoPtr
概述中的示例。
强制转换运算符。
operator T* () const throw();
返回指向类模板中定义的对象数据类型的指针。
请参阅CAutoPtr
概述中的示例。