crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> вылетает на QVector::reserve, где косяк?
mezmay
  опции профиля:
сообщение 11.8.2011, 8:54
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Есть кусок кода, вылетает на последней строчке:
        QVector<QVector<SBlock<T> > > vvBlocks(m_vBlocksLength.size());

        vvBlocks[0].reserve(ceil((double)bufSize/m_vBlocksLength[0]));
        
        for(U64 i=0; i<bufSize; i+=m_vBlocksLength[0])
        {
            T min = DBL_MAX;
            T max = -DBL_MAX;

            for(U64 j=0; j < m_vBlocksLength[0] && i + j < bufSize; j++)
            {
                if(vData[i + j] > max)
                    max = vData[i + j];
                if(vData[i + j] < min)
                    min = vData[i + j];
            }
            SBlock<T> block;
            block.max = max;
            block.min = min;

            vvBlocks[0].push_back/*append*/(block);
        }

        vvBlocks[1].reserve(vvBlocks[0].size()/m_lengthCoeff); // вылетает здесь

Почему это может быть? Причем если закомментировать цикл
for(U64 j=0; j < m_vBlocksLength[0] && i + j < bufSize; j++)

то перестает вылетать, хотя в этом цикле нет ничего связанного вектором vvBlocks

Сообщение отредактировал mezmay - 11.8.2011, 9:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.8.2011, 6:11
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


0) либо vvBlocks[0].size() безумно большое значение
1) либо m_lengthCoeff равно 0
2) а то и всё выражение возвращает большое значение

На что отладчик то ? :) И какое сообщение показывается в дебаге при вылете ?

Сообщение отредактировал Алексей1153 - 12.8.2011, 6:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 12.8.2011, 8:46
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


там все значения корректные, вылетать будет даже если тупо написать
vvBlocks[1].reserve(10);



Сообщение отредактировал mezmay - 12.8.2011, 8:51
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.8.2011, 10:49
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


mezmay, порушена куча. Ты где-то неправильно работаешь с контейнером. А по твоей программе сразу сложно понять, где, распиши, что где делается

или, как вариант, у тебя m_vBlocksLength.size()==1

ты обращаешься по индексу, не проверив размер массива

vvBlocks[1].reserve....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 12.8.2011, 12:58
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


перенес этот код в отдельную программу, все работает. Следовательно, косяк где-то в другом месте. Наверное, как ты и сказал где-то рушится куча. Не подскажешь как в visual studio это отследить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 12.8.2011, 15:03
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Ура!!! Решил проблему! Короче дело обстояло так: в потоке обрабатывался файл, и информация о ходе обработки посылалась в основной поток с помощью событий и соответственно функции QCoreApplication::postEvent(). Проблема была в том что я создавал объект события статически, а в документации сказано:

The event must be allocated on the heap since the post event queue will take ownership of the event and delete it once it has been posted. It is not safe to modify or delete the event after it has been posted.

надо было вовремя читать документацию. Спасибо тебе Алексей1153, без твоей помощи я бы наверное не обратил на это внимания!

Сообщение отредактировал mezmay - 12.8.2011, 15:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.8.2011, 19:25
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


mezmay, я случайно ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.4.2024, 17:24