Russian Qt Forum
Ноябрь 10, 2024, 22:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Ересь с QFile  (Прочитано 7840 раз)
OKTA
Гость
« : Апрель 11, 2014, 10:22 »

Товарищи, откройте глаза, в чем может быть проблема?
В первом варианте я жестко задаю путь и имя файла, создаю его, пишу данные, закрываю => сохраняется успешно на диске и все ок.
Во втором варианте выбираю путь через QFileDialog, создаю его, пишу данные, закрываю => сохраняется успешно на диске и после этого приложение вылетает с
Цитировать
Unhandled exception at 0x7764E753 (ntdll.dll) in Test_app.exe: 0xC0000374: Куча была повреждена (parameters: 0x77684270).
Повреждается куча, когда я удаляю данные, которые записывал в файл (данные и место их получения не завязаны с QFile и QFileDialog).
Но как такое может зависеть от метода выбора пути сохранения файла??
« Последнее редактирование: Апрель 11, 2014, 12:46 от OKTA » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Апрель 11, 2014, 10:27 »

Куча может быть повреждена раньше, создание/открытия диалога может это только "вытаскивать на глаза".
Записан
OKTA
Гость
« Ответ #2 : Апрель 11, 2014, 10:31 »

Диалог выбора пути не связан с функцией, где я пишу в файл данные. Механизм передачи пути одинаков и по умолчанию (без открытия диалога) в функцию передается просто QDir::homePath(). А сам объект, который я пишу, создается в куче как раз в этой функции, где и запись в файл + разве запись в файл была бы успешной при поврежденной куче?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Апрель 11, 2014, 10:34 »

Диалог выбора пути не связан с функцией, где я пишу в файл данные. Механизм передачи пути одинаков и по умолчанию (без открытия диалога) в функцию передается просто QDir::homePath(). А сам объект, который я пишу, создается в куче как раз в этой функции, где и запись в файл + разве запись в файл была бы успешной при поврежденной куче?
Куча может быть разрушена совершенно в другом месте значительно раньше и никак не связана с записываемыми данными.
Запустите программу под valgrind, думаю он покажет проблемные места.
Записан
Bepec
Гость
« Ответ #4 : Апрель 11, 2014, 10:50 »

Самая паршивая ошибка, которую я встречал после гонки потоков. Память где то разрушена, место надо искать по всей программе. Нигде и ничто ни с чем не связано, но... но разрушает.
Записан
OKTA
Гость
« Ответ #5 : Апрель 11, 2014, 10:52 »

Сижу пока на Windows - не могу поюзать.
Видимо кучу повреждает QFileDialog  Непонимающий Но вопрос, как он может это делать??

Если его запускать таким образом, он же создается в стеке, разве нет?
Код:
QString path = QFileDialog::getExistingDirectory(this, "Select directory",
                                                     QDir::homePath(),
                                                      QFileDialog::ShowDirsOnly
                                                      | QFileDialog::DontResolveSymlinks);


Да и потоки не используются Непонимающий
« Последнее редактирование: Апрель 11, 2014, 11:02 от OKTA » Записан
Bepec
Гость
« Ответ #6 : Апрель 11, 2014, 11:01 »

Повреждена память. Т.е. выход за границы массива, указатели, прочее.

FileDialog не портит память. FileDialog обращается к испорченной области. Он не возбудитель болезни, он следствие. Улыбающийся

PS советую перед как раз вызовом диалога пройтись по всем переменным класса и посмотреть - нет ли где там бяки.

PPS в прошлый раз у меня такое было при выходе за границы массива - при запуске перезаписывалась ячейка памяти +1 размера массива. В результате падало при попытке записи в COM порт.
« Последнее редактирование: Апрель 11, 2014, 11:03 от Bepec » Записан
OKTA
Гость
« Ответ #7 : Апрель 11, 2014, 11:32 »

Повреждена память. Т.е. выход за границы массива, указатели, прочее.

FileDialog не портит память. FileDialog обращается к испорченной области. Он не возбудитель болезни, он следствие. Улыбающийся

PS советую перед как раз вызовом диалога пройтись по всем переменным класса и посмотреть - нет ли где там бяки.

PPS в прошлый раз у меня такое было при выходе за границы массива - при запуске перезаписывалась ячейка памяти +1 размера массива. В результате падало при попытке записи в COM порт.

Так видать не по переменным класса, а вообще по всем переменным в проекте, создаваемым динамически  Смеющийся  Хорошее занятие для пятницы  Смеющийся
Записан
Bepec
Гость
« Ответ #8 : Апрель 11, 2014, 11:33 »

У меня 2 проекта было переписано с 0 по паре тысяч строк из-за такой гадости.
Записан
OKTA
Гость
« Ответ #9 : Апрель 11, 2014, 11:34 »

У меня 2 проекта было переписано с 0 по паре тысяч строк из-за такой гадости.

Я тебя, Верес, конечно уважаю, но за такие ужасы и запугивания, могу и побить  Смеющийся Смеющийся Смеющийся
Записан
Bepec
Гость
« Ответ #10 : Апрель 11, 2014, 12:00 »

Я факты привожу Веселый Молод был, горяч Веселый
Тогда было проще переписать, чем найти багу Веселый
Записан
OKTA
Гость
« Ответ #11 : Апрель 11, 2014, 12:13 »

Спасибо, буду искать)  Подмигивающий
Переписать ересь, которую я пишу сейчас уже само по себе ересь  Смеющийся
Записан
OKTA
Гость
« Ответ #12 : Апрель 11, 2014, 12:45 »

О да, я нашел ошибку  Крутой
Библиотека, которую я использую, выделяла память через GlobalAlloc и в одном месте я по привычке сделал не GlobalFree, а delete  Крутой
Интересно конечно, как именно крошилась память при вызове QFileDialog, но это уже другой вопрос)

Кстати, сразу вопрос о QFile, точнее о QDataStream, который используется для записи в файл.
На сколько гуманно записывать структуры в поток через int QDataStream::writeRawData ( const char * s, int len )?
Учитывая, что я точно знаю размер структуры? Это ведь аналогично fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ) или я путаю?
« Последнее редактирование: Апрель 11, 2014, 14:10 от OKTA » Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #13 : Апрель 11, 2014, 18:01 »

Сижу пока на Windows - не могу поюзать.
Видимо кучу повреждает QFileDialog  Непонимающий Но вопрос, как он может это делать??
В одной из версий Qt под MinGW диалог открытия файла вел себя очень скверно.
В дебаге помнится даже софт вешал. какая-то из четвертой версии. 4.2.2 или 4.7.2.
Могу ошибиться в версии.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
OKTA
Гость
« Ответ #14 : Апрель 11, 2014, 18:02 »

Сижу в 4.7.4, но тут QFileDialog оказался не виноват  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.