Недавно я провел несколько стресс-тестов для своего приложения Qt 4.8. Я видел с помощью инструмента массива valgrind, что он вызывает расширение кучи памяти ...
Используя этот инструмент, я обнаружил, что эта память выделяется этой трассировкой стека (это другой вызов массива, поэтому значения отличаются от один на скриншоте):
->02.11% (1,133,952B) 0x221FD9EB: ??? (in /usr/lib/x86_64-linux-gnu/qt4/plugins/accessible/libqtaccessiblewidgets.so)
| ->02.11% (1,133,952B) 0x80ADE69: QAccessible::queryAccessibleInterface(QObject*) (in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.7)
| ->01.18% (637,824B) 0x80B5156: ??? (in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.7)
| | ->01.18% (637,824B) 0x8BA0F6E: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.7)
| | ->01.18% (637,824B) 0x8BF1472: QAbstractItemModel::rowsInserted(QModelIndex const&, int, int) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.7)
| | ->01.18% (637,824B) 0x8B86510: QAbstractItemModel::endInsertRows() (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.7)
| | ->01.18% (637,824B) in 5 places, all below massif's threshold (1.00%)
Причиной расширений являются функции endInsertRows и endRemoveRows. Моя реализация ModelView выглядит так:
void TrainScheduleModelView::addTrain(const model::object::Train &train)
{
if (this->m_rows == TrainScheduleModelView::MAX_TRAIN_SCHEDULE_SIZE)
{
beginRemoveRows(QModelIndex(),
TrainScheduleModelView::MAX_TRAIN_SCHEDULE_SIZE - 1,
TrainScheduleModelView::MAX_TRAIN_SCHEDULE_SIZE - 1);
endRemoveRows();
}
beginInsertRows(QModelIndex(), 0, 0);
this->m_trains[this->m_head].second = train;
this->m_trains[this->m_head].first = true;
if (0 == this->m_head)
{
this->m_head = TrainScheduleModelView::MAX_TRAIN_SCHEDULE_SIZE - 1;
}
else
{
--(this->m_head);
}
if (this->m_rows < TrainScheduleModelView::MAX_TRAIN_SCHEDULE_SIZE)
{
++(this->m_rows);
}
endInsertRows();
}
Эта модель намеренно основана на C -массивах, каждый раз, когда добавляется новый объект, последний усекается.
Может кто-нибудь сказать у меня есть ошибка, или я использую ее неправильно?