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;
}