[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