The documentation for QList::erase says:

-- Removes the item associated with the iterator *pos* from the list, and
returns an iterator to the next item in the list (which may be end
<file:///Users/placinta/Library/Application%20Support/Dash/DocSets/Qt_5/Qt.docset/Contents/Resources/Documents/doc.qt.io/qt-5/qlist.html#end>
()).

Documentation for iterator::operator++() says:

Calling this function on QList::end
<file:///Users/placinta/Library/Application%20Support/Dash/DocSets/Qt_5/Qt.docset/Contents/Resources/Documents/doc.qt.io/qt-5/qlist.html#end>()
leads to undefined results.

You have no check in your code to see if the iterator return by erase is
QList::end(), thus calling operator++ on it might crash your application.


On Mon, Sep 14, 2015 at 6:13 PM, Igor Mironchik <igor.mironc...@gmail.com>
wrote:

> Hi,
>
> it seems that problem not in the iterating and deletion from cantainer...
>
> I wrote simple test app and everything is ok.
>
> But something here crashes my app and only in release mode, so I can't
> understand what is the problem...
>
> And ideas?
>
> 9/14/2015 6:06 PM, André Somers пишет:
> > Op 14-9-2015 om 16:57 schreef Igor Mironchik:
> >> Hi,
> >>
> >> I ran into this problem...
> >>
> >> void
> >> ImageFilesStoragePrivate::removeAllImages(
> >>        QList< ImageRecord > & images,
> >>        ImageFilesStorage::ImageType type )
> >> {
> >>        QList< ImageRecord >::Iterator it = images.begin();
> >>        QList< ImageRecord >::Iterator last = images.end();
> >>
> >>        while( it != last )
> >>        {
> >>            if( (*it).m_type == type )
> >>            {
> >>                LOG( DebugLogLevel, "Before real deletion" )
> >>                removeFromDatabase( it );
> >>                LOG( DebugLogLevel, "After real deletion" )
> >>
> >> //            it = images.erase( it ); // LOOK AT THIS LINE !!! If I
> >> uncomment it and comment next line - crash...
> >>                ++it;
> >>
> >>                LOG( DebugLogLevel, QString( "it == last : %1" ).arg( (
> it
> >> == last ? "true" : "false" ) ) )
> >>            }
> >>            else
> >>                ++it;
> >>        }
> >> }
> >>
> >> What is wrong?
> > A lot is wrong.
> >
> > First, you are not using standard algorithms to do standard things. I'd
> > say std::remove_if with std::erase would be a better way to solve the
> issue.
> >
> > Then in general, if you delete from the container, iterators are going
> > to be invalidated. Iterate backwards if you are going to delete items
> > from the container.
> >
> > Last: you probably don't want to use QList but QVector.
> >
> > André
> >
> >
> > _______________________________________________
> > Interest mailing list
> > Interest@qt-project.org
> > http://lists.qt-project.org/mailman/listinfo/interest
>
> _______________________________________________
> Interest mailing list
> Interest@qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to