2016-10-10 10 views
0

У меня есть список указателей, которые мне больше не нужны. Для того, чтобы удалить все из них, я могу нормально просматривать список:Удаление содержимого std :: list

for (T* ptr: mylist) { 
    delete ptr; 
} 

Или я могу удалить первый или последний элемент, пока список не пуст:

while (!mylist.empty()) { 
    delete mylist.front(); //or mylist.back() 
    mylist.pop_front(); //or mylist.pop_back() 
} 

Что является предпочтительным способом, как для производительности и ясности?

ответ

4

Лучший способ хранения std::unique_ptr's в списке и не управлять памятью самостоятельно. Тогда вы просто сделаете mylist.clear().

+0

'std :: list :: clear' совершенно новый для меня lal. Однако хорошее предложение. – user6245072

+0

Обратите внимание, что 'clear' удалит все элементы из списка. Умные указатели при удалении также освободят память, которую они держат. Но обычные указатели не будут. Таким образом, этот метод работает только с интеллектуальными указателями. В любом случае, теперь вручную удаление объектов считается плохой практикой, поскольку оно слишком подвержено ошибкам. –

+0

Приятно знать, что последний бит. Спасибо за все. – user6245072

1

Они делают две разные вещи. Второй оставляет вас с пустым списком. Первый оставляет список со списком недействительных указателей; что может или не имеет значения, в зависимости от того, что происходит со списком после этой операции.

1

Я бы использовал ваш первый пример. Для лучшей практики вы должны очистить свой список, чтобы убедиться, что в нем нет недействительных указателей.

for (T* ptr : mylist) delete ptr; 
mylist.clear();