Question about iterator management in sw/source/core/fields/cellfml.cxx
Michael Stahl
mstahl at redhat.com
Fri Feb 3 07:18:12 PST 2012
On 03/02/12 14:01, Stephan Bergmann wrote:
> On 02/02/2012 09:08 PM, julien2412 wrote:
>> Would this patch better ? (I kept the for loop)
>
> Unfortunately that still has a problem. After "rBoxes.erase(toErase)",
> "it" (which is the same as "toErase") is invalidated, so incrementing it
> (up in the for(...;...;...) part) has undefined behavior.
>
> The "standard idiom" is
>
> for (iterator i = m.begin(); i != m.end();) {
> if (doErase) {
> m.erase(i++);
> } else {
> ++i;
> }
> }
but doesn't that have the same problem? "i" is incremented only after
the erase is complete, when "i" is already invalid.
shouldn't this be something like:
for (iterator i = m.begin(); i != m.end(); ) {
if (doErase) {
iterator const j = i++;
m.erase(j);
} else {
++i;
}
}
>> I read that to erase a position on a iterator invalidate this iterator from
>> position to the end
>> (http://www.cplusplus.com/reference/stl/vector/erase/)
>> I don't know if to create this temporary variable "toErase" change something
>> or it's all the same.
>
> The text you cite is about vector, for which *all* iterators into a
> vector are invalidated upon an erase.
i think i read this "invalidate from position to end" in the SGI
documentation as well; does the actual standard give implementations
more freedom here?
More information about the LibreOffice
mailing list