vector::erase
Removes from the vector container and calls its destructor but If the contained object is a pointer it doesnt take ownership of destroying it.
You will have to explicitly call delete on each contained pointer to delete the content it is pointing to, for example:
void clearVectorContents( std::vector <YourClass*> & a ) { for ( int i = 0; i < a.size(); i++ ) { delete a[i]; } a.clear(); }
Storing raw pointers in standard containers is not a good idea. If you really need to store resources that have to be allocated by new, then you should use boost::shared_ptr. Check out the Boost documentation.
An more generic & elegant solution:
This solution makes use of for_each & templates as @Billy pointed out in comments:
// 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; } };
And this can be called as:
for_each( myclassVector.begin(),myclassVector.end(), DeleteVector<myclass*>());
where, myclassVector is your vector containing pointers to myclass class objects.
Usage Example:
#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; }