CObject コレクションの全オブジェクトの削除
この記事では、コレクションのすべてのオブジェクトを (コレクション オブジェクト自体は削除せずに) 削除する方法について説明します。
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
演算子を使用して削除します。配列の要素を削除 (delete) した後、
RemoveAll
関数を呼び出してそれらをすべて削除 (remove) します。配列のすべての要素を削除するコードは次のとおりです。
CArray<CPerson*, CPerson*> myArray; int i = 0; while (i < myArray.GetSize()) { delete myArray.GetAt(i++); } myArray.RemoveAll();
前述のリストの例と同様、RemoveAll
を呼び出して配列内のすべての要素を削除するか、RemoveAt
を呼び出して個別に要素を削除することができます。
マップからすべての要素を削除するには
GetStartPosition
とGetNextAssoc
を使用して配列を反復処理します。反復処理で検出された各マップ要素のキーまたは値を、
delete
演算子を使用して削除します。マップの要素を削除 (delete) した後、
RemoveAll
関数を呼び出してそれらをすべて削除 (remove) します。CMap
コレクションのすべての要素を削除するコードは次のとおりです。 マップ内の各要素には、キーとしての文字列と、値としてのCPerson
オブジェクト (CObject
から派生) が割り当てられています。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
を呼び出して、指定したキーの要素を個別に削除します。