Eliminar todos los objetos de una colección CObject
En este artículo se explica cómo eliminar todos los objetos de una colección (sin eliminar el propio objeto de colección).
Para eliminar todos los objetos de una colección de objetos CObject
(o de objetos derivados CObject
), use una de las técnicas de iteración descritas en el artículo Acceso a todos los miembros de una colección para eliminar los objetos uno a uno.
Precaución
Los objetos de las colecciones se pueden compartir. 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 compartido hasta que todas las partes hayan terminado de usarlo.
En este artículo se muestra cómo eliminar los objetos de:
Para eliminar todos los objetos de una lista de punteros a CObject
Use
GetHeadPosition
yGetNext
para recorrer la lista en iteración.Use el operador
delete
para eliminar cada objeto tal cual se encuentre en la iteración.Llame a la función
RemoveAll
para quitar todos los elementos de la lista después de eliminar los objetos asociados a esos elementos.
En el ejemplo siguiente se muestra cómo eliminar todos los objetos de una lista de objetos CPerson
. Cada objeto de la lista es un puntero a un objeto CPerson
asignado originalmente en el montón.
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 última llamada de función, RemoveAll
, es una función miembro de lista que quita todos los elementos de la lista. La función miembro RemoveAt
quita un único elemento.
Observe la diferencia entre eliminar el objeto de un elemento y quitar el propio elemento. Al quitar un elemento de la lista simplemente se quita la referencia de la lista al objeto. El objeto sigue existiendo en la memoria. Cuando se elimina un objeto, deja de existir y se reclama su memoria. Por lo tanto, es importante quitar un elemento inmediatamente después de que se haya eliminado el objeto del elemento para que la lista no intente acceder a objetos que ya no existen.
Para eliminar todos los elementos de una matriz
Use
GetSize
y valores de índice enteros para recorrer en iteración la matriz.Use el operador
delete
para eliminar cada elemento tal cual se encuentre en la iteración.Llame a la función
RemoveAll
para quitar todos los elementos de la matriz una vez eliminados.El código para eliminar todos los elementos de una matriz es el siguiente:
CArray<CPerson*, CPerson*> myArray; int i = 0; while (i < myArray.GetSize()) { delete myArray.GetAt(i++); } myArray.RemoveAll();
Al igual que en el ejemplo de lista anterior, puede llamar a RemoveAll
para quitar todos los elementos de una matriz o a RemoveAt
para quitar un elemento individual.
Para eliminar todos los elementos de una asignación
Use
GetStartPosition
yGetNextAssoc
para recorrer la matriz en iteración.Use el operador
delete
para eliminar la clave o el valor de cada elemento de asignación tal cual se encuentre en la iteración.Llame a la función
RemoveAll
para quitar todos los elementos de la asignación una vez eliminados.El código para eliminar todos los elementos de una colección
CMap
es el siguiente. Cada elemento de la asignación tiene una cadena como clave y un objetoCPerson
(derivado deCObject
) 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 una asignación o a RemoveKey
para quitar un elemento individual con la clave especificada.