[sldev] [VIEWER] Daring construct? (is this safe?)

Q Linden q at lindenlab.com
Wed Sep 26 09:22:53 PDT 2007


Yes, this is safe. The iterator post-increment returns a temporary copy 
of the previous value, which is used for the erase (and invalidated). 
The gi iterator is still valid in a map.

If mGroups had been a vector or other non-hashed container instead of a 
map, erasing an item invalidates ALL iterators and the code would be unsafe.

    Q

Nicholaz Beresford wrote:
>
> Seen in llgroupmgr.cpp at 1330
>
> mGroups is a std::map.
>
> Question is if the mGroups.erase(gi++); is safe or depends on
> order of evaluation and/or possibly accesses freed memory
> (doing the increment after the erase)?
>
> (I'm seeing this in a lot of places ... grep erase\(.*++\);   ).
>
>
>
> // get rid of groups that aren't observed
> for (group_iter gi = mGroups.begin(); gi != mGroups.end() && 
> mGroups.size() > MAX_CACHED_GROUPS / 2; )
> {
>     observer_iter oi = mObservers.find(gi->first);
>     if (oi == mObservers.end())
>     {
>         // not observed
>         LLGroupMgrGroupData* group_datap = gi->second;
>         delete group_datap;
>         mGroups.erase(gi++);
>     }
>     else
>     {
>         ++gi;
>     }
> }
>
>



More information about the SLDev mailing list