From: Jozef M. <mis...@ho...> - 2008-01-22 22:52:34
|
you stated that correctly, only iterator i gets invalidated after erase BUT= i++ or ++i is calling a function on an invalidated iterator. what happens?= can you call functions on invalidated iterators? i am not sure about the te= chnical skills of the guys discussing this topic but i think you can get th= e point herehttp://www.velocityreviews.com/forums/t283023-stl-stdmap-erase.= html it is good to know what happens exactly, but when the only person who= knows is YOU then other developers can get confused. so better use 100% co= rrect code (at least in pdfedit :))... jozo=20 Date: Tue, 22 Jan 2008 13:57:55 +0100From: ms...@gm...To: pdfedit-dev= el...@li...Subject: Re: [Pdfedit-devel] stl iterators On Jan 22, 2008 12:13 AM, Jozef Misutka <mis...@ho...> wrote: there are several places where std::erase+iterators are not used correctly= =20 please correct it you can use the provided patch jozo Index: cpdf.cc=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3DRCS file: /cvsroot/pdfedit/pdf= edit/src/kernel/cpdf.cc,vretrieving revision 1.86.2.1 diff -u -r1.86.2.1 cp= df.cc--- cpdf.cc 18 Jan 2008 00:46:05 -0000 1.86.2.1+++ cpdf.cc 21 Jan 2008= 22:45:22 -0000@@ -2401,7 +2401,7 @@ IndiRef ref=3DgetValueFromSimple<C= Ref>(oldValue); bool found=3Dfalse;- for(PageList::iterator i= =3DpageList.begin(); i!=3DpageList.end(); ++i)+ for(PageList::iterator i= =3DpageList.begin(); i!=3DpageList.end();) { shared_ptr<CPage> pag= e=3Di->second; // checks page's dictionary whether it is in oldDict_p= tr sub@@ -2419,16 +2419,19 @@ page->invalidate(); // NOTE: std:= :map keeps iterators following iterators // valid after removing - = pageList.erase(i);+ pageList.erase(i++); This is not an error or bad usage of map iterators AFAIK. Comment above era= seis little bit confusing, but it states that iterators behind (and before = too) i are *not* invalided by erase method. This means that I can do i++ (i= -- etc.) unless I do *dereference* this iterator. From (http://www.sgi.com/= tech/stl/Map.html):" Erasing an element from a map also does not invalidate= any iterators, except, of course, for iterators that actually point to the= element that is being erased."But maybe I have misunderstood something. I = will go over my code again and check this again[...]-- Michal Hocko=20 _________________________________________________________________ Connect and share in new ways with Windows Live. http://www.windowslive.com/share.html?ocid=3DTXT_TAGHM_Wave2_sharelife_0120= 08= |