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 CObject
s (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
Use
GetHeadPosition
eGetNext
para iterar pela lista.Use o operador
delete
para excluir cada objeto como ele é encontrado na iteração.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
Use
GetSize
e valores de índice de inteiro para iterar por meio da matriz.Use o operador
delete
para excluir cada elemento como ele é encontrado na iteração.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
Use
GetStartPosition
eGetNextAssoc
para iterar pela matriz.Use o operador
delete
para excluir a chave e/ou o valor de cada elemento de mapa conforme ele é encontrado na iteração.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 objetoCPerson
(derivado deCObject
) 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.