Поделиться через


Удалить все объекты в коллекции CObject

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

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

Предупреждающее замечаниеВнимание

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

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

  • Список

  • Массив

  • Сопоставление

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

  1. Используйте GetHeadPosition и GetNext для прохода по списку.

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

  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. Используйте оператор удалить для удаления каждый элемент в том виде, в котором он встречается в итерации.

  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. Используйте оператор удалить для удаления клавиша и/или значение для каждого элемента карты в том виде, в котором он встречается в итерации.

  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 чтобы удалить отдельный элемент с указанным ключом.

См. также

Задачи

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