Partilhar via


Excluindo todos os objetos em uma coleção CObject

Este artigo explica como excluir todos os objetos de 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 Acessando todos os membros de uma coleção para excluir cada objeto por vez.

Atenção

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. Utilize GetHeadPosition e GetNext para iterar através da lista.

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

  3. Chame a RemoveAll função 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 CPerson objetos. Cada objeto na lista é um ponteiro para um CPerson objeto 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 de membro da lista que remove todos os elementos da lista. A função RemoveAt de membro remove um único elemento.

Observe a diferença entre excluir o objeto de um elemento e remover o próprio elemento. A remoção de um elemento da lista apenas 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. Assim, é importante remover um elemento imediatamente após o objeto do elemento ter sido excluído para que a lista não tente acessar objetos que não existem mais.

Para excluir todos os elementos de uma matriz

  1. Use GetSize e valores de índice inteiro para iterar através da matriz.

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

  3. Chame a RemoveAll função 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();
    

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 de um mapa

  1. Use GetStartPosition e GetNextAssoc para iterar através da matriz.

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

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

    O código para excluir todos os elementos de uma CMap coleção é o seguinte. Cada elemento no mapa tem uma cadeia de caracteres como a chave e um CPerson objeto (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.

Ver também

Acessando todos os membros de uma coleção