Look in while statement....

9/14/2015 6:28 PM, Croitor Alexandru пишет:
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 <mailto: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 <mailto:Interest@qt-project.org>
    > http://lists.qt-project.org/mailman/listinfo/interest

    _______________________________________________
    Interest mailing list
    Interest@qt-project.org <mailto: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