Eliminar todos los objetos de una colección CObject
En este artículo se explica cómo eliminar todos los objetos en una colección (sin eliminar el propio objeto de colección).
Para eliminar todos los objetos de una colección de s de CObject(o de objetos derivados de CObject), se usa una de las técnicas de iteración descritas en el caso Acceso a miembros desde una colección para eliminar cada objeto a la vez.
Advertencia
Los objetos de colecciones pueden ser compartidos.Es decir, la colección mantiene un puntero al objeto, pero otras partes del programa también pueden tener punteros al mismo objeto.Debe tener cuidado de no eliminar un objeto se comparte hasta que todas las partes hayan terminado de utilizar el objeto.
En este artículo se muestra cómo eliminar los objetos de:
Una lista
Una matriz
Un mapa
Para eliminar todos los objetos de una lista de punteros a CObject
Uso GetHeadPosition y GetNext de recorrer en iteración la lista.
Utilice el operador de borrar para eliminar cada objeto como se encuentra en la iteración.
Llame a la función de RemoveAll para quitar todos los elementos de la lista después de los objetos asociados a esos elementos se han eliminado.
El ejemplo siguiente se muestra cómo eliminar todos los objetos de una lista de objetos de CPerson . Cada objeto de la lista es un puntero a un objeto de CPerson que fue asignado originalmente en la pila.
CTypedPtrList<CObList, CPerson*> myList;
CPerson* pPerson = new CPerson();
myList.AddHead(pPerson);
POSITION pos = myList.GetHeadPosition();
while(pos != NULL)
{
delete myList.GetNext(pos);
}
myList.RemoveAll();
La llamada de función última, RemoveAll, es una función miembro de la lista que quita todos los elementos de la lista. La función RemoveAt miembro quita un solo elemento.
Observe la diferencia entre eliminar el objeto de un elemento y quitar el propio elemento. Quitar un elemento de la lista quita simplemente la referencia de lista al objeto. El objeto aún existe en memoria. Cuando se elimina un objeto, dejan de existir y la reclamación de la memoria. Por tanto, es importante quitar un elemento inmediatamente después de que se ha eliminado el objeto de elemento de modo que la lista no intente tener acceso a los objetos que ya no existen.
Para eliminar todos los elementos de una matriz
Utilice GetSize y los valores de índice enteros para recorrer la matriz.
Utilice el operador de borrar para eliminar cada elemento como se encuentra en la iteración.
Llame a la función de RemoveAll para quitar todos los elementos de la matriz después de que se han eliminado.
El código para eliminar todos los elementos de una matriz es la siguiente:
CArray<CPerson*, CPerson*> myArray; int i = 0; while (i < myArray.GetSize()) { delete myArray.GetAt(i++); } myArray.RemoveAll();
Como en el ejemplo de la lista anterior, puede llamar a RemoveAll para quitar todos los elementos de una matriz o RemoveAt para quitar un elemento individual.
Para eliminar todos los elementos de un mapa
Utilice GetStartPosition y GetNextAssoc para recorrer la matriz.
Utilice el operador de borrar para eliminar la clave y el valor para cada elemento asignado como se encuentra en la iteración.
Llame a la función de RemoveAll para quitar todos los elementos de mapa después de que se han eliminado.
El código para eliminar todos los elementos de una colección de CMap es la siguiente. Cada elemento del mapa tiene una cadena como clave y objeto de CPerson (derivados de CObject) como 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();
Puede llamar a RemoveAll para quitar todos los elementos de un mapa o RemoveKey para quitar un elemento individual con la clave especificada.