Compartir a través de


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

  1. Use GetHeadPosition y GetNext para recorrer la lista en iteración.

  2. Use el operador delete para eliminar cada objeto tal cual se encuentre en la iteración.

  3. 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

  1. Use GetSize y valores de índice enteros para recorrer en iteración la matriz.

  2. Use el operador delete para eliminar cada elemento tal cual se encuentre en la iteración.

  3. 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

  1. Use GetStartPosition y GetNextAssoc para recorrer la matriz en iteración.

  2. 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.

  3. 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 objeto CPerson (derivado 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 una asignación o a RemoveKey para quitar un elemento individual con la clave especificada.

Consulte también

Acceso a todos los miembros de una colección