удаление всех объектов из коллекции CObject
В этой статье описывается, как удалить все объекты в коллекции (без удаления объекта коллекции сам).
Для удаления всех объектов в коллекции CObject (или объектов, производных от CObject), используйте один из традиционных методов итераций, описанных в статье Доступ ко всем членам коллекции для удаления каждый объект в свою очередь.
Предупреждение
Объекты в коллекциях можно использовать совместно.То есть коллекция сохраняет указатель на объект, а другие части программы могут также иметь указатели на один объект.Следует соблюдать осторожность не удалять объект, который доступен до тех пор, пока все части не будет завершен с помощью объекта.
В данной статье показано, как удалять объекты в:
Список
Массив
Сопоставление
Удалить все объекты в списке указателей на CObject
Используйте GetHeadPosition и GetNext для перебора списка.
Оператор удалить для удаления каждый объект, так как он встречается в итерации.
Вызовите функцию 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 удалить один элемент.
Обратите внимание на разницу между удалять объект элемента и удаления сам элемент. Удаление элементов из списка просто удаляет ссылку на объект списка. Объект все еще существует в памяти. При удалении объекта, он перестает существовать и его освобождение памяти. Поэтому следует удалить элемент сразу после элемента объект был удален, что список не пытается получить объекты, которые уже не существуют.
Удаление всех элементов в массиве
Используйте GetSize и значения индекса целого числа для перебора элементов массива.
Оператор удалить для удаления каждый элемент как он встречается в итерации.
Вызовите функцию RemoveAll для удаления всех элементов массива после того, как они были удалены.
Код для удаления всех элементов массива следующим образом:
CArray<CPerson*, CPerson*> myArray; int i = 0; while (i < myArray.GetSize()) { delete myArray.GetAt(i++); } myArray.RemoveAll();
Как и в случае с образцом списка выше, можно вызвать RemoveAll для удаления всех элементов в массиве или RemoveAt для удаления одного элемента.
Удаление всех элементов в сопоставлении
Используйте GetStartPosition и GetNextAssoc для перебора элементов массива.
Оператор удалить для удаления ключ и значение для каждого элемента сопоставления, так как он встречается в итерации.
Вызовите функцию 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 для удаления один элемент с указанным ключом.