Очистка списка STL / вектора указателей - PullRequest
49 голосов
/ 21 ноября 2008

Какой кратчайший кусок C ++ вы можете придумать для безопасной очистки вектора или списка указателей? (при условии, что вам нужно вызвать delete на указателях?)

list<Foo*> foo_list;

Я бы предпочел не использовать Boost или оборачивать мои указатели умными указателями.

Ответы [ 15 ]

4 голосов
/ 21 ноября 2008

По крайней мере, для списка, итерирования и удаления, а затем вызова clear в конце немного неэффективно, так как это требует обхода списка дважды, когда вам действительно нужно сделать это только один раз. Вот немного лучший способ:

for (list<Foo*>::iterator i = foo_list.begin(), e = foo_list.end(); i != e; )
{
    list<Foo*>::iterator tmp(i++);
    delete *tmp;
    foo_list.erase(tmp);
}

Тем не менее, ваш компилятор может быть достаточно умным, чтобы в любом случае объединить два цикла в зависимости от того, как реализован list :: clear.

3 голосов
/ 16 сентября 2014

Начиная с C ++ 11:

std::vector<Type*> v;
...
std::for_each(v.begin(), v.end(), std::default_delete<Type>());

Или, если вы пишете шаблонный код и хотите не указывать конкретный тип:

std::for_each(v.begin(), v.end(),
    std::default_delete<std::remove_pointer<decltype(v)::value_type>::type>());

Который (начиная с C ++ 14) можно сократить как:

std::for_each(v.begin(), v.end(),
    std::default_delete<std::remove_pointer_t<decltype(v)::value_type>>());
1 голос
/ 05 декабря 2013
void remove(Foo* foo) { delete foo; }
....
for_each( foo_list.begin(), foo_list.end(), remove );
0 голосов
/ 02 июля 2018

Это кажется самым чистым imo, но ваша версия c ++ должна поддерживать этот тип итерации (я думаю, что все, включая или перед c ++ 0x, будет работать):

for (Object *i : container) delete i;    
container.clear();
0 голосов
/ 21 ноября 2008
for (list<Foo*>::const_iterator i = foo_list.begin(), e = foo_list.end(); i != e; ++i)
    delete *i;
foo_list.clear();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...