Search code examples
c++visual-c++vectoriteratorerase

How to erase & delete pointers to objects stored in a vector?


I have a vector that stores pointers to many objects instantiated dynamically, and I'm trying to iterate through the vector and remove certain elements (remove from vector and destroy object), but I'm having trouble. Here's what it looks like:

    vector<Entity*> Entities;
    /* Fill vector here */
    vector<Entity*>::iterator it;
    for(it=Entities.begin(); it!=Entities.end(); it++)
        if((*it)->getXPos() > 1.5f)
            Entities.erase(it);

When any of the Entity objects get to xPos>1.5, the program crashes with an assertion error... Anyone know what I'm doing wrong?

I'm using VC++ 2008.


Solution

  • You need to be careful because erase() will invalidate existing iterators. However, it will return a new valid iterator you can use:

    for ( it = Entities.begin(); it != Entities.end(); ) {
       if( (*it)->getXPos() > 1.5f ) {
          delete * it;  
          it = Entities.erase(it);
       }
       else {
          ++it;
       }
    }