次の方法で共有


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 演算子ではなく別のヒープ関数を使ってメモリを割り当て、解放する点が異なります。 CAutoVectorPtrCAutoPtr に似ています。唯一の違いは、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 の概要」の例を参照してください。

関連項目

CHeapPtr クラス
CAutoVectorPtr クラス
クラスの概要