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