Russian Qt Forum

Qt => Model-View (MV) => Тема начата: CMorgan от Октябрь 12, 2011, 15:03



Название: selectedRows() - вызывает Heap Corruption что делать?
Отправлено: CMorgan от Октябрь 12, 2011, 15:03
Добрый день.
Работаю с QT 4.7.4. VisualStudio Add-In 1.1.9 (Студия 2008,2010)
Необходимо из QTableView получить индексы выделенных пользователем строк. Пишу слот:

Код:
void fileLoader::ClearStocUpdateTableLine()
{

  QModelIndexList index=m_grid_view->dataBaseTableView->selectionModel()->selectedRows(0); //dataBaseTableView - как раз объект QTableView
 
  int index_size=index.size();
  QString curr_index;
for (int i=0;i<index_size;i++)
{
    curr_index=index[i].data().toString();
}

}//<---- вот тут вываливается  Heap Corruption при попытке уничтожить объект QModelIndexList index

Heap Corruption вылезает и под 2008 и под 2010-й студией, но только в Дебажном варианте, в релизе все работает нормально.  Индексы возвращает правильные (что выделяю на QTableView, то и возвращает), рушится именно при попытке освободить память QList.
Чего я делаю не так?.


Название: Re: selectedRows() - вызывает Heap Corruption что делать?
Отправлено: Пантер от Октябрь 12, 2011, 15:12
Тут ошибки не вижу. Скорее всего, она в другом месте, а тут просто проявляется.


Название: Re: selectedRows() - вызывает Heap Corruption что делать?
Отправлено: CMorgan от Октябрь 12, 2011, 17:22
Ради интереса собрал сейчас приложение из QT example addressbook (ничего в нем не меняя) - симптомы точно такие же.

При выборе строки приложение вываливается при дебажной сборке, в релизной все работает как надо.

Т.е. конкретно проблемы с selectedRows  :-[


Название: Re: selectedRows() - вызывает Heap Corruption что делать?
Отправлено: Пантер от Октябрь 12, 2011, 18:15
Попробуй продебажить "вглубь" и найти где точно падает.


Название: Re: selectedRows() - вызывает Heap Corruption что делать?
Отправлено: CMorgan от Октябрь 13, 2011, 11:12
В общем при любом действии связанном с удалением элемента из QModelIndexList index под дебагом(будь-то вызов деструктора, clear или просто стирание одного элемента) прога вываливается сюда:

qregion.cpp:
Код:
QRegion::~QRegion()
{
    if (!d->ref.deref()) //<----
        cleanUp(d);
}



И крашится.


Название: Re: selectedRows() - вызывает Heap Corruption что делать?
Отправлено: Пантер от Октябрь 13, 2011, 11:22
QModelIndexList
QRegion
Что-то не то. :) Походу, где-то бьешь память.


Название: Re: selectedRows() - вызывает Heap Corruption что делать?
Отправлено: CMorgan от Октябрь 13, 2011, 16:10
Решили траблу.
Пришлось скачивать qt-everywhere-opensource-src-4.7.4 и собирать ее под 2010 студией.  И тогда все заработало как надо.

Баг был вызван использованием qt-win-opensource-4.7.4-vs2008 в 2010ке. Хотя ничего беды не предвещало и до этого момента  с QModelIndexList все работало нормально ;)