Share via


CObject コレクションの全オブジェクトの削除

この記事では、コレクションのすべてのオブジェクトを (コレクション オブジェクト自体は削除せずに) 削除する方法について説明します。

CObject (または CObject から派生したオブジェクト) のコレクションからすべてのオブジェクトを削除するには、「コレクションの全メンバーへのアクセス」の記事で説明されているいずれかの反復手法を使用して各オブジェクトを次々に削除します。

注意事項

コレクション内のオブジェクトは共有されている可能性があります。 つまり、コレクションはオブジェクトへのポインターを保持しますが、プログラムの他の要素が、同じオブジェクトへのポインターを保持していることも考えられます。 すべての要素がオブジェクトを使い終えるまでは、共有されているオブジェクトを削除しないよう注意してください。

この記事では、次のものからオブジェクトを削除する方法について説明します。

CObject へのポインターのリストからすべてのオブジェクトを削除するには

  1. GetHeadPositionGetNext を使用してリストを反復処理します。

  2. 反復処理で検出された各オブジェクトを、delete 演算子を使用して削除します。

  3. リストの要素に関連付けられているオブジェクトが削除された後、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 は、個別の要素を削除するメンバー関数です。

要素のオブジェクトを削除することと要素自体を削除することの違いに注意してください。 リストから要素を削除しても、オブジェクトに対するリストの参照が削除されるだけです。 オブジェクトは依然としてメモリに存在します。 オブジェクトが削除されてはじめてその存在が消え、そのメモリが解放されます。 したがって、存在しないオブジェクトにリストがアクセスしようとするのを避けるため、要素のオブジェクトが削除されたら、その要素を速やかに削除することが大切です。

配列からすべての要素を削除するには

  1. GetSize と整数のインデックス値を使用して配列を反復処理します。

  2. 反復処理で検出された各要素を、delete 演算子を使用して削除します。

  3. 配列の要素を削除 (delete) した後、RemoveAll 関数を呼び出してそれらをすべて削除 (remove) します。

    配列のすべての要素を削除するコードは次のとおりです。

    CArray<CPerson*, CPerson*> myArray;
    
    int i = 0;
    while (i < myArray.GetSize())
    {
       delete myArray.GetAt(i++);
    }
    
    myArray.RemoveAll();
    

前述のリストの例と同様、RemoveAll を呼び出して配列内のすべての要素を削除するか、RemoveAt を呼び出して個別に要素を削除することができます。

マップからすべての要素を削除するには

  1. GetStartPositionGetNextAssoc を使用して配列を反復処理します。

  2. 反復処理で検出された各マップ要素のキーまたは値を、delete 演算子を使用して削除します。

  3. マップの要素を削除 (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 を呼び出して、指定したキーの要素を個別に削除します。

関連項目

コレクションの全メンバーへのアクセス