Очистка вектора указателей

215
17

Предположим, что я определил такой класс:


 class foo {
private:
std::vector< int* > v;
public:
...
void bar1()
{
for (int i = 0; i < 10; i++) {
int *a = new int;
v.push_back( a );
}
};

void bar2()
{
std::vector< int >::iterator it = v.begin();
for ( ; it != v.end(); it++ )
std::cout << (*it);
v.clear();
}
};


Короче говоря, я отталкиваю некоторые указатели в векторе, позже я очищаю вектор. Вопрос в том, имеет ли этот код утечку памяти? Я имею в виду, очистив вектор, правильно ли удалены указатели?

спросил(а) 2012-10-09T10:46:00+04:00 8 лет, 1 месяц назад
1
Решение
117

Нет, вы просто очищаете векторное хранилище. Выделенная память с "новым" все еще существует.


for (int i =0; i< v.size();i++)
{
delete (v[i]);
}
v.clear();

ответил(а) 2012-10-09T10:48:00+04:00 8 лет, 1 месяц назад
248

Да, в коде есть утечка памяти, если вы не удалите указатели. Если класс foo владеет указателями, он обязан удалить их. Вы должны сделать это перед очисткой вектора, в противном случае вы потеряете дескриптор памяти, которую нужно отменить.

   for (auto p : v)
{
delete p;
}
v.clear();

Вы можете полностью избежать проблемы управления памятью, используя std::vector подходящего интеллектуального указателя.

ответил(а) 2012-10-09T10:48:00+04:00 8 лет, 1 месяц назад
140

Я думаю, что самое короткое и ясное решение было бы:

std::vector<Object*> container = ... ;
for (Object* obj : container)
delete obj;
container.clear();

ответил(а) 2015-10-01T19:06:00+03:00 5 лет, 1 месяц назад
82

Вы можете использовать for_each:


std::vector<int*> v;

template<typename T>
struct deleter : std::unary_function<const T*, void>
{
void operator() (const T *ptr) const
{
delete ptr;
}
};

// call deleter for each element , freeing them
std::for_each (v.begin (), v.end (), deleter<int> ());
v.clear ();

ответил(а) 2012-10-09T10:52:00+04:00 8 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема