Cppcheck Dangerous iterator usage after erase()-method

Julien Nabet serval2412 at yahoo.fr
Sun Sep 16 04:03:50 PDT 2012


On 16/09/2012 12:26, Noel Grandin wrote:
> On Sat, Sep 15, 2012 at 9:13 PM, Markus Mohrhard
> <markus.mohrhard at googlemail.com>  wrote:
>> Hey,
>>
>>
>>> Here are the lines:
>>>      178 void SwBlink::FrmDelete( const SwRootFrm* pRoot )
>>>      179 {
>>>      180     for( SwBlinkList::iterator it = aList.begin(); it !=
>>> aList.end(); )
>>>      181     {
>>>      182         if( pRoot == (*it).GetRootFrm() )
>>>      183             aList.erase( it );
>>>      184         else
>>>      185             ++it;
>>>      186     }
>>>      187 }
>>>
>>> I must recognize, I don't understand how can it work above all if we go  in
>>> the "if" since there's no increment.
>>>
>>> Any idea?
>> It can't. Line 183 is supposed to be:
>>
>> aList.erase(it++);
>>
> No, it should be
>     it = aList.erase(it);
>
> Once you have called erase(), the iterator becomes invalid, so it must
> be replaced by the iterator returned by erase(), which returns the
> next valid position,
Except that SwBlinkList inherits from boost::ptr_set, I don't know how 
iterator works with this class.
Some container returns an iterator when you call erase method, some not. 
Sometimes it depends on if you use C++11
Moreover what kind of things can invalidate iterator still seem hard to 
remember (see 
http://cb.nowan.net/blog/2004/12/30/what-will-invalidate-your-iterators/).
So I let experts decide :)

Julien


More information about the LibreOffice mailing list