Да, вам нужно delete
самостоятельно. Вектор только «разрушает» указатели (которые ничего не делают).
Если можете, используйте библиотеку контейнеров Boost указатель , и вам не придется об этом беспокоиться Однако, если вы не можете, вам нужно обернуть контейнер. Рассмотрим исключение между временем заполнения контейнера и временем удаления его элементов. Вы будете не выполнять код удаления элемента и утечки.
Простая оболочка может выглядеть так:
struct default_deleter
{
template <typename T>
void operator()(T* pPtr)
{
delete pPtr;
}
};
template <typename T, typename Deleter = default_deleter>
struct container_wrapper
{
typedef T container_type;
typedef Deleter deleter_type;
container_wrapper(container_type pContainer = container_type()) :
container(pContainer)
{}
~container_wrapper(void)
{
std::for_each(container.begin(), container.end(), deleter_type());
}
container_type container;
};
Используйте это как:
typedef std::vector<int*> vec_intptr;
typedef container_wrapper<vec_intptr> vec;
vec v;
v.container.push_back(new int); // and never worry about it again
Это простая оболочка. Любые операции pop_back()
, erase()
и т. Д. Будут иметь неправильный эффект. Я настоятельно рекомендую использовать Boost.
Можно подумать об использовании контейнера auto_ptr
. Наоборот, это плохая идея; семантика копирования auto_ptr
не позволяет ему работать. Наилучший вариант - по возможности избавиться от динамического выделения.