次の方法で共有


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. RemoveAll 関数を呼び出して、削除した要素をすべて配列から除去します。

    次に、配列内のすべての要素を削除するプログラム例を示します。

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

上のリスト例と同じように、配列内のすべての要素を削除するには RemoveAll を呼び出します。要素を個別に削除するには RemoveAt を呼び出します。

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

  1. GetStartPositionGetNextAssoc でマップに順次アクセスします。

  2. 順次アクセスしたマップ要素のキーおよび値を delete 演算子で削除します。

  3. マップの要素をすべて削除したら、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 を呼び出します。

参照

処理手順

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