Ответ 1
vector::erase
Удаляет из векторного контейнера и вызывает его деструктор, но если содержащийся объект является указателем, он не принимает на себя ответственность за его уничтожение.
Вам нужно будет явно вызвать delete для каждого содержащегося указателя для удаления содержимого, на которое оно указывает, например:
void clearVectorContents( std::vector <YourClass*> & a )
{
for ( int i = 0; i < a.size(); i++ )
{
delete a[i];
}
a.clear();
}
Хранение исходных указателей в стандартных контейнерах не является хорошей идеей. Если вам действительно нужно сохранить ресурсы, которые должны быть выделены new
, тогда вы должны использовать boost::shared_ptr
. Ознакомьтесь с Документация Boost.
Более общее и элегантное решение:
Это решение использует for_each
и templates
, как @Billy указал в комментариях:
// Functor for deleting pointers in vector.
template<class T> class DeleteVector
{
public:
// Overloaded () operator.
// This will be called by for_each() function.
bool operator()(T x) const
{
// Delete pointer.
delete x;
return true;
}
};
И это можно назвать:
for_each( myclassVector.begin(),myclassVector.end(),
DeleteVector<myclass*>());
где myclassVector
- ваш вектор, содержащий указатели на объекты класса myclass
.
Пример использования:
#include "functional"
#include "vector"
#include "algorithm"
#include "iostream"
//Your class
class myclass
{
public:
int i;
myclass():i(10){}
};
// Functor for deleting pointers in vector.
template<class T> class DeleteVector
{
public:
// Overloaded () operator.
// This will be called by for_each() function.
bool operator()(T x) const
{
// Delete pointer.
delete x;
return true;
}
};
int main()
{
// Add 10 objects to the vector.
std::vector<myclass*> myclassVector;
for( int Index = 0; Index < 10; ++Index )
{
myclassVector.push_back( new myclass);
}
for (int i=0; i<myclassVector.size(); i++)
{
std::cout << " " << (myclassVector[i])->i;
}
// Now delete the vector contents in a single line.
for_each( myclassVector.begin(),
myclassVector.end(),
DeleteVector<myclass*>());
//Clear the vector
myclassVector.clear();
std::cout<<"\n"<<myclassVector.size();
return 0;
}