Вопрос довольно расплывчатый ... но в любом случае, я думаю, вам интересно, будут ли указатели, хранящиеся в vector
, автоматически удаляться при вызове clear()
.
Это не тот случай. Все, что вы храните в vector
, будет вызывать деструктор при появлении clear()
. А деструктор примитивного типа (например, указатель) ничего не делает ..
Из моей реализации SGI:
/**
* Erases all the elements. Note that this function only erases the
* elements, and that if the elements themselves are pointers, the
* pointed-to memory is not touched in any way. Managing the pointer is
* the user's responsibilty.
*/
void
clear() { erase(begin(), end()); }
Чтобы правильно удалить указатели элементов в любом контейнере STL, проще всего создать функтор и применить его к каждому элементу:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <functional>
#include <algorithm>
template <typename ValueT>
struct func_delete : public std::unary_function<ValueT,void>
{
void operator()( ValueT& item ) { delete item; }
};
struct Foo
{
~Foo() { std::cout << "Foo::~Foo()" << std::endl; }
};
template <typename ContainerT>
void delete_container( ContainerT& container )
{
std::for_each( container.begin(), container.end(), func_delete<typename ContainerT::value_type>() );
}
int main( int argc, char** argv )
{
std::vector<Foo*> foos;
foos.push_back( new Foo );
foos.push_back( new Foo );
foos.push_back( new Foo );
// Either of these two lines will work
//std::for_each( foos.begin(), foos.end(), func_delete<Foo*>() );
//delete_container( foos );
foos.clear();
return EXIT_SUCCESS;
}