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

nik at terminaldischarge.net nik at terminaldischarge.net
Wed Sep 26 09:29:30 PDT 2007


I should read questions better.

> 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;
>>     }
>> }
>>
>>
>
> _______________________________________________
> Click here to unsubscribe or manage your list subscription:
> /index.html
>




More information about the SLDev mailing list