CAutoPtr クラス
更新 : 2007 年 11 月
このクラスは、スマート ポインタ オブジェクトを表します。
template<
typename T
>
class CAutoPtr
パラメータ
- T
ポインタ型。
解説
このクラスには、スマート ポインタを作成し、管理するメソッドが用意されています。このメソッドは、スコープ外に出たリソースを解放し、メモリ リークを防ぎます。
さらに、CAutoPtr のコピー コンストラクタと代入演算子は、ポインタを別のポインタにコピーし、元のポインタに NULL を設定することにより、ポインタの所有権を転送します。これにより、同じポインタを 2 つの CAutoPtr オブジェクトに格納できなくなるため、同じポインタを 2 度削除する可能性を減らすことができます。
また、CAutoPtr によって、ポインタのコレクションの作成を簡単に行うことができます。コレクション クラスを派生し、デストラクタをオーバーライドするよりも、CAutoPtr オブジェクトのコレクションを作成する方が簡単です。コレクションを削除すると、CAutoPtr オブジェクトはスコープからはずれ、自動的に削除されます。
メモリの割り当てと解放を行うときに、C++ の new 演算子と delete 演算子ではなく別のヒープ関数を使用する点を除けば、CHeapPtr とバリアントは、CAutoPtr と同じ動作をします。メモリの割り当ておよび解放に vector new[] および vector delete[] を使用する点を除けば、CAutoVectorPtr は CAutoPtr とよく似ています。
スマート ポインタの配列またはリストが必要な場合は、「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;
}