В режиме отладки приложение вылетает вот с такой информацией:
ASSERT failure in QVector<T>::operator[]: "index out of range", file D:\Qt\Qt5.3.1_mingw\5.3\mingw482_32\include/QtCore/qvector.h, line 385
Invalid parameter passed to C runtime function.
Это здорово, но бесполезно. Почему QtCreator не останавливается в месте ошибки? В чем тогда польза этого ассерта? Как тогда найти место с ошибкой?
Может нужно как-то настроить отладчик?
UPDATE
Спасибо за помощь.
Вопрос свелся к тому, куда поставить точку останова.
В файл qvector.h точка останова не ставилась:
template <typename T>
inline T &QVector<T>::operator[](int i)
{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
return data()[i]; }
Вышел из ситуации, переопределив QtMessageHandler:
#include <iostream>
#include <QApplication>
#include <QString>
void myMessageOutput(QtMsgType type, const QMessageLogContext & context, const QString & msg)
{
switch (type)
{
case QtDebugMsg:
std::cerr << QString("Debug: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
break;
case QtWarningMsg:
std::cerr << QString("Warning: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
break;
case QtCriticalMsg:
std::cerr << QString("Critical: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
break;
case QtFatalMsg:
std::cerr << QString("Fatal: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
abort();
}
}
int main(int argc, char *argv[])
{
qInstallMessageHandler(myMessageOutput);
QApplication a(argc, argv);
return a.exec();
}
На abort(); точка останова поставилась.