Удаление всех объектов в коллекции CObject

Замечание

Библиотека классов Microsoft Foundation (MFC) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.

В этой статье объясняется, как удалить все объекты в коллекции (без удаления самого объекта коллекции).

Чтобы удалить все объекты в коллекции CObject (или объекты, произведенные от CObject), используйте один из методов итерации, описанных в статье "Доступ ко всем элементам коллекции", чтобы удалить каждый объект по очереди.

Осторожность

Объекты в коллекциях можно совместно использовать. То есть коллекция сохраняет указатель на объект, но другие части программы также могут иметь указатели на тот же объект. Следует не удалять общий объект до тех пор, пока все пользователи не закончат его использовать.

В этой статье показано, как удалить объекты в:

Удаление всех объектов в списке указателей на CObject

  1. Используйте GetHeadPosition и GetNext, чтобы выполнить итерацию по списку.

  2. Используйте оператор delete, чтобы удалить каждый объект по мере его обнаружения в итерации.

  3. Вызовите функцию RemoveAll , чтобы удалить все элементы из списка после удаления объектов, связанных с этими элементами.

В следующем примере показано, как удалить все объекты из списка CPerson объектов. В списке каждый объект — это указатель на объект CPerson, который изначально был выделен в куче.

CTypedPtrList<CObList, CPerson*> myList;
CPerson* pPerson = new CPerson();
myList.AddHead(pPerson);
POSITION pos = myList.GetHeadPosition();

while (pos != NULL)
{
   delete myList.GetNext(pos);
}
myList.RemoveAll();

Последний вызов функции RemoveAll является функцией-членом списка, которая удаляет все элементы из списка. Функция-член RemoveAt удаляет один элемент.

Обратите внимание на разницу между удалением объекта элемента и удалением самого элемента. Удаление элемента из списка просто удаляет ссылку списка на объект. Объект по-прежнему существует в памяти. При удалении объекта он перестает существовать, а его память восстанавливается. Таким образом, важно сразу же удалить элемент после удаления объекта элемента, чтобы список не пытался получить доступ к объектам, которые больше не существуют.

Удаление всех элементов в массиве

  1. Используйте GetSize и целые значения индекса для итерации по массиву.

  2. Используйте оператор delete, чтобы удалять каждый элемент по мере его обнаружения в процессе итерации.

  3. Вызовите функцию RemoveAll , чтобы удалить все элементы из массива после их удаления.

    Код для удаления всех элементов массива выглядит следующим образом:

    CArray<CPerson*, CPerson*> myArray;
    
    int i = 0;
    while (i < myArray.GetSize())
    {
       delete myArray.GetAt(i++);
    }
    
    myArray.RemoveAll();
    

Как и в приведенном выше примере списка, можно вызвать RemoveAll удаление всех элементов в массиве или RemoveAt удалить отдельный элемент.

Удаление всех элементов карты

  1. Используйте GetStartPosition и GetNextAssoc, чтобы выполнить итерацию по массиву.

  2. delete Используйте оператор, чтобы удалить ключ и (или) значение для каждого элемента карты, так как оно встречается в итерации.

  3. Вызовите функцию RemoveAll , чтобы удалить все элементы из карты после их удаления.

    Код для удаления всех элементов CMap коллекции выглядит следующим образом. Каждый элемент в карте имеет строку в качестве ключа и CPerson объекта (производного от CObject) в качестве значения.

    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();
    

Можно вызвать RemoveAll удаление всех элементов на карте или RemoveKey удалить отдельный элемент с указанным ключом.

См. также

Доступ ко всем элементам коллекции