2013-05-14 3 views
6

Поэтому у меня есть вектор указателей вроде так:Как освободить элемент в векторе указателей?

vector<Example*> ve; 

Я заполнить этот вектор с указателями, как этот

Example* e = new Example(); 
ve.push_back(e) 

Но когда я хочу, чтобы удалить их, как я убедиться, что они получают освобождаться? Этого достаточно?

ve.erase(ve.begin() + 1) 
delete ve[1] 
+2

Одна вещь, чтобы рассмотреть вопрос: требуется ли указатели на всех? Вы выполняете, если объекты имеют разные (полиморфные) типы; или если они невозможны или непозволительно дороги для перемещения; или если вектор не «владеет» им (что он делает здесь, так как вы хотите освободить их при удалении). В противном случае рассмотрим 'vector '. –

ответ

8

Вы должны сделать это наоборот, конечно:

delete ve[1]; 
ve.erase(ve.begin() + 1); 

Однако, это гораздо предпочтительнее использовать смарт-указатели (например, std::unique_ptr) вместо сырых указателей при выражении собственности.

1

Вы должны удалить указатели перед тем стирая вектор:

for (vector<Example *>::iterator it = vec.begin(); it != vec.end(); it++) { 
    delete *it; 
} 

vec.clear(); 
+0

Используйте 'vec.clear()' вместо 'vec.erase (vec.begin(), vec.end())'. –

+0

@MikeDeSimone достаточно честный, фиксированный. – 2013-05-14 12:12:35

Смежные вопросы