Should we delete before or after removal for a pointer in a vector?

Should be removed before or after erase. I understand that everything is in order. Is it correct?

Also, is there any case we don’t want to delete an item when it is erased? I believe that it should be, otherwise I erasewill be glad to take responsibility.

std::vector<foo*> bar;
...
for (vector<foo*>::iterator itr = bar.begin(); itr != bar.end(); itr++)
{
   delete (*itr);  //before OR
   bar.erase(itr);
   delete (*itr);  //after???
}
+5
source share
5 answers

"itr" should be used as follows:

for (vector<foo*>::iterator itr = bar.begin(); itr != bar.end(); )
{
   delete (*itr);
   itr = bar.erase(itr);
}

However, I would prefer to remove all the elements first and then clear the vector;

for (vector<foo*>::iterator itr = bar.begin(); itr != bar.end(); ++itr)
   delete (*itr);
bar.clear();
+10
source

Using an iterator to erase an item invalidates the iterator. You must delete the item before deleting it.

.

+4

, - , ?

, - , ? , ? .

++ 0x , :

std::vector<std::unique_ptr<foo>> vec;

. , . ++.

++ 0x, std::vector<boost::shared_ptr<foo> > boost::ptr_vector<foo>. shared_ptr std::tr1 std, #include <memory>.

+3

, , , , :

std::vector<foo*> v1;
//...
while(!v1.empty())
{
    delete v1.back();
    v1.pop_back( );
}

, ( )

+2

erase vector. *iter undefined. , delete erase. , erase vector ( iter , iter++ ). erase clear .

+1

All Articles