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