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

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

Чтобы удалить все объекты в коллекции (или производных 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 удалить отдельный элемент с указанным ключом.

См. также

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