Excluindo todos os objetos em uma coleção CObject

Este artigo explica como excluir todos os objetos em uma coleção (sem excluir o próprio objeto de coleção).

Para excluir todos os objetos em uma coleção de CObjects (ou de objetos derivados de CObject), use uma das técnicas de iteração descritas no artigo Acessar todos os membros de uma coleção para excluir cada objeto por vez.

Cuidado

Objetos em coleções podem ser compartilhados. Ou seja, a coleção mantém um ponteiro para o objeto, mas outras partes do programa também podem ter ponteiros para o mesmo objeto. Você deve ter cuidado para não excluir um objeto que é compartilhado até que todas as partes tenham terminado de usar o objeto.

Este artigo mostra como excluir os objetos em:

Para excluir todos os objetos em uma lista de ponteiros para CObject

  1. Use GetHeadPosition e GetNext para iterar pela lista.

  2. Use o operador delete para excluir cada objeto como ele é encontrado na iteração.

  3. Chame a função RemoveAll para remover todos os elementos da lista depois que os objetos associados a esses elementos tiverem sido excluídos.

O exemplo a seguir mostra como excluir todos os objetos de uma lista de objetos CPerson. Cada objeto na lista é um ponteiro para um objeto CPerson que foi originalmente alocado no heap.

CTypedPtrList<CObList, CPerson*> myList;
CPerson* pPerson = new CPerson();
myList.AddHead(pPerson);
POSITION pos = myList.GetHeadPosition();

while (pos != NULL)
{
   delete myList.GetNext(pos);
}
myList.RemoveAll();

A última chamada de função, RemoveAll, é uma função membro de lista que remove todos os elementos da lista. A função membro RemoveAt remove um único elemento.

Observe a diferença entre excluir o objeto de um elemento e remover o elemento em si. Remover um elemento da lista simplesmente remove a referência da lista ao objeto. O objeto ainda existe na memória. Quando você exclui um objeto, ele deixa de existir e sua memória é recuperada. Portanto, é importante remover um elemento imediatamente após a exclusão do objeto do elemento para que a lista não tente acessar objetos que não existem mais.

Para excluir todos os elementos em uma matriz

  1. Use GetSize e valores de índice de inteiro para iterar por meio da matriz.

  2. Use o operador delete para excluir cada elemento como ele é encontrado na iteração.

  3. Chame a função RemoveAll para remover todos os elementos da matriz depois que eles tiverem sido excluídos.

    O código para excluir todos os elementos de uma matriz é o seguinte:

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

Assim como no exemplo de lista acima, você pode chamar RemoveAll para remover todos os elementos em uma matriz ou RemoveAt para remover um elemento individual.

Para excluir todos os elementos em um mapa

  1. Use GetStartPosition e GetNextAssoc para iterar pela matriz.

  2. Use o operador delete para excluir a chave e/ou o valor de cada elemento de mapa conforme ele é encontrado na iteração.

  3. Chame a função RemoveAll para remover todos os elementos do mapa depois que eles tiverem sido excluídos.

    O código para excluir todos os elementos de uma coleção CMap é o seguinte. Cada elemento no mapa tem uma cadeia de caracteres como a chave e um objeto CPerson (derivado de CObject) como o valor.

    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();
    

Você pode chamar RemoveAll para remover todos os elementos em um mapa ou RemoveKey para remover um elemento individual com a chave especificada.

Confira também

Acessando todos os membros de uma coleção