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 に設定します。 そのため、2 つの CAutoPtr
オブジェクトがそれぞれ同じポインターを格納することは不可能です。また、これにより、同じポインターを 2 度削除する可能性も低くなります。
また、CAutoPtr
を使うと、ポインターのコレクションの作成も簡単になります。 コレクション クラスを派生させてデストラクターをオーバーライドするのではなく、CAutoPtr
オブジェクトのコレクションを作成する方が簡単です。 コレクションが削除されると、CAutoPtr
オブジェクトはスコープ外になり、自動的に自身を削除します。
CHeapPtr
とそのバリアントは CAutoPtr
と同じように機能しますが、C++ の new
および delete
演算子ではなく別のヒープ関数を使ってメモリを割り当て、解放する点が異なります。 CAutoVectorPtr
は CAutoPtr
に似ています。唯一の違いは、vector new[] と vector 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
の概要」の例を参照してください。