On Mon, Feb 09, 2015 at 02:22:04PM -0700, julien2412 [via Document Foundation Mail Archive] wrote:
<br/><div class='shrinkable-quote'><br/>> On RelationTableView.cxx file, I noticed this:
<br/>>      99     for(;aIter != rTabWinDataList.rend();++aIter)
<br/>>     100     {
<br/>>     101         TTableWindowData::value_type pData = *aIter;
<br/>>     102         OTableWindow* pTabWin = createWindow(pData);
<br/>>     103 
<br/>>     104         if (!pTabWin->Init())
<br/>>     105         {
<br/>> ... 
<br/>>     112             rTabWinDataList.erase(
<br/>> ::std::remove(rTabWinDataList.begin(), rTabWinDataList.end(), *aIter),
<br/>> rTabWinDataList.end());
<br/>>     113             continue;
<br/>>     114         }
<br/>> 
<br/>> idem block 139-143
<br/>> 
<br/>> See
<br/>> <a href="http://opengrok.libreoffice.org/xref/core/dbaccess/source/ui/relationdesign/RelationTableView.cxx#99" target="_top" rel="nofollow" link="external">http://opengrok.libreoffice.org/xref/core/dbaccess/source/ui/relationdesign/RelationTableView.cxx#99</a><br/>> 
<br/>> Shouldn't the "continue" be replaced by "break" to avoid invalid iterator or
<br/>> "aIter" isn't invalid for "for loops" at all even after "erase"
<br/>> lines?
</div><br/>Note that aIter is a *reverse* iterator, that goes backwards.
<br/><br/>After erase(A, B), the iterators pointing to positions A or after are
<br/>invalid, but iterators pointing to positions BEFORE A are valid.
<br/><br/>The std::remove will move elements inside rTabWinDataList, moving all
<br/>elements that are equal to *aIter to the end. The erase then actually
<br/>removes these elements (the ones equal to aIter). It seems to me that:
<br/><br/>1) the return value of std::remove is guaranteed to be at aIter or
<br/>   after.
<br/><br/>2) thus the erase can only invalidate positions at and after aIter.
<br/><br/>3) then we do ++aIter (moving it LEFT, backwards), which thus then
<br/>   guaranteed to be a valid position (or rend, that is one-before-the
<br/>   first position).
<br/><br/>4) However, this algorithm means that (unless rTabWinDataList is
<br/>   sorted or something like that), the for loop might traverse the
<br/>   same *elements* SEVERAL TIMES, since they are moved around, it may
<br/>   encounter the same element several times at different positions.
<br/><br/>5) It will, however, not miss any element equivalence class,
<br/>   traversing each element OR AN ELEMENT EQUAL TO IT at least once.
<br/><br/>-- 
<br/>Lionel
<br/>

        
        
        
<br/><hr align="left" width="300" />
View this message in context: <a href="http://nabble.documentfoundation.org/Invalid-iterator-in-RelationTableView-cxx-dbaccess-module-tp4139541p4139547.html">Re: Invalid iterator in RelationTableView.cxx? (dbaccess module)</a><br/>
Sent from the <a href="http://nabble.documentfoundation.org/Dev-f1639786.html">Dev mailing list archive</a> at Nabble.com.<br/>