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


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

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

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

См. также

Задачи

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