CObject コレクションの全オブジェクトの削除
更新 : 2007 年 11 月
ここでは、コレクション オブジェクト自体を削除せずに、コレクション内のすべてのオブジェクトを削除する方法について説明します。
CObject またはその派生オブジェクトのコレクションからすべてのオブジェクトを削除するには、「コレクションの全メンバへのアクセス」で説明した繰り返し手順のいずれかを使って、各オブジェクトを順次削除します。
注意 : |
---|
コレクション内のオブジェクトは共有できます。つまり、コレクション内のポインタが指しているオブジェクトをプログラムのほかの部分で使われているポインタが指していることがあります。したがって、共有オブジェクトは、参照元がなくなるまで削除しないでください。 |
ここでは、以下のコレクションからオブジェクトを削除する方法について説明します。
CObject へのポインタのリストからすべてのオブジェクトを削除するには
配列内のすべての要素を削除するには
マップ内のすべての要素を削除するには
CObject へのポインタのリストからすべてのオブジェクトを削除するには
GetHeadPosition と GetNext でリストに対して繰り返しアクセスします。
delete 演算子でオブジェクトを順次削除します。
オブジェクトの削除が完了したら、RemoveAll 関数を呼び出してオブジェクトに対応付けられているすべての要素をリストから削除します。
次に、CPerson オブジェクトのリストからすべてのオブジェクトを削除する例を示します。リスト内の各オブジェクトは、ヒープ領域に割り当てられている CPerson オブジェクトを指すポインタです。
CTypedPtrList<CObList, CPerson*> myList;
CPerson* pPerson = new CPerson();
myList.AddHead(pPerson);
POSITION pos = myList.GetHeadPosition();
while(pos != NULL)
{
delete myList.GetNext(pos);
}
myList.RemoveAll();
最後に呼び出した RemoveAll は、リスト メンバ関数です。この関数は、リスト内のすべての要素を削除します。要素を個別に削除するには、RemoveAt メンバ関数を使用します。
要素のオブジェクトを削除することは、要素自体を削除することではありません。リストから要素を削除すると、リストからオブジェクトへの参照が削除されます。オブジェクト自体はメモリ上に残っています。一方、オブジェクトを削除すると、オブジェクトが消滅するので、メモリがクリアされます。したがって、オブジェクトを削除したときは、その要素を直ちに削除する必要があります。削除しないと、存在しないオブジェクトが参照されます。
配列内のすべての要素を削除するには
GetSize と整数インデックス値によって配列に順次アクセスします。
順次アクセスした要素を delete 演算子で、削除します。
RemoveAll 関数を呼び出して、削除した要素をすべて配列から除去します。
次に、配列内のすべての要素を削除するプログラム例を示します。
CArray<CPerson*, CPerson*> myArray; int i = 0; while (i < myArray.GetSize()) { delete myArray.GetAt(i++); } myArray.RemoveAll();
上のリスト例と同じように、配列内のすべての要素を削除するには RemoveAll を呼び出します。要素を個別に削除するには RemoveAt を呼び出します。
マップ内のすべての要素を削除するには
GetStartPosition と GetNextAssoc でマップに順次アクセスします。
順次アクセスしたマップ要素のキーおよび値を delete 演算子で削除します。
マップの要素をすべて削除したら、RemoveAll 関数ですべての要素をマップから除去します。
次に、CMap コレクションのすべての要素を削除するプログラム例を示します。マップの各要素は、キー (文字列) と値 (CObject の派生オブジェクト Cperson) で構成されます。
CMap<CString, LPCTSTR, CPerson*, CPerson*> myMap; // ... Add some key-value elements ... // Now delete the elements POSITION pos = myMap.GetStartPosition(); while(pos != NULL) { CPerson* pPerson; CString string; // Gets key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, pPerson); delete pPerson; } // RemoveAll deletes the keys myMap.RemoveAll();
マップのすべての要素を削除するには、RemoveAll を呼び出します。指定したキーに対応する要素を削除するには、RemoveKey を呼び出します。