Russian Qt Forum

Qt => Общие вопросы => Тема начата: OKTA от Апрель 11, 2014, 10:22



Название: [РЕШЕНО] Ересь с QFile
Отправлено: OKTA от Апрель 11, 2014, 10:22
Товарищи, откройте глаза, в чем может быть проблема?
В первом варианте я жестко задаю путь и имя файла, создаю его, пишу данные, закрываю => сохраняется успешно на диске и все ок.
Во втором варианте выбираю путь через QFileDialog, создаю его, пишу данные, закрываю => сохраняется успешно на диске и после этого приложение вылетает с
Цитировать
Unhandled exception at 0x7764E753 (ntdll.dll) in Test_app.exe: 0xC0000374: Куча была повреждена (parameters: 0x77684270).
Повреждается куча, когда я удаляю данные, которые записывал в файл (данные и место их получения не завязаны с QFile и QFileDialog).
Но как такое может зависеть от метода выбора пути сохранения файла??


Название: Re: Ересь с QFile
Отправлено: Old от Апрель 11, 2014, 10:27
Куча может быть повреждена раньше, создание/открытия диалога может это только "вытаскивать на глаза".


Название: Re: Ересь с QFile
Отправлено: OKTA от Апрель 11, 2014, 10:31
Диалог выбора пути не связан с функцией, где я пишу в файл данные. Механизм передачи пути одинаков и по умолчанию (без открытия диалога) в функцию передается просто QDir::homePath(). А сам объект, который я пишу, создается в куче как раз в этой функции, где и запись в файл + разве запись в файл была бы успешной при поврежденной куче?


Название: Re: Ересь с QFile
Отправлено: Old от Апрель 11, 2014, 10:34
Диалог выбора пути не связан с функцией, где я пишу в файл данные. Механизм передачи пути одинаков и по умолчанию (без открытия диалога) в функцию передается просто QDir::homePath(). А сам объект, который я пишу, создается в куче как раз в этой функции, где и запись в файл + разве запись в файл была бы успешной при поврежденной куче?
Куча может быть разрушена совершенно в другом месте значительно раньше и никак не связана с записываемыми данными.
Запустите программу под valgrind, думаю он покажет проблемные места.


Название: Re: Ересь с QFile
Отправлено: Bepec от Апрель 11, 2014, 10:50
Самая паршивая ошибка, которую я встречал после гонки потоков. Память где то разрушена, место надо искать по всей программе. Нигде и ничто ни с чем не связано, но... но разрушает.


Название: Re: Ересь с QFile
Отправлено: OKTA от Апрель 11, 2014, 10:52
Сижу пока на Windows - не могу поюзать.
Видимо кучу повреждает QFileDialog  ??? Но вопрос, как он может это делать??

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


Да и потоки не используются ???


Название: Re: Ересь с QFile
Отправлено: Bepec от Апрель 11, 2014, 11:01
Повреждена память. Т.е. выход за границы массива, указатели, прочее.

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

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

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


Название: Re: Ересь с QFile
Отправлено: OKTA от Апрель 11, 2014, 11:32
Повреждена память. Т.е. выход за границы массива, указатели, прочее.

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

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

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

Так видать не по переменным класса, а вообще по всем переменным в проекте, создаваемым динамически  ;D  Хорошее занятие для пятницы  ;D


Название: Re: Ересь с QFile
Отправлено: Bepec от Апрель 11, 2014, 11:33
У меня 2 проекта было переписано с 0 по паре тысяч строк из-за такой гадости.


Название: Re: Ересь с QFile
Отправлено: OKTA от Апрель 11, 2014, 11:34
У меня 2 проекта было переписано с 0 по паре тысяч строк из-за такой гадости.

Я тебя, Верес, конечно уважаю, но за такие ужасы и запугивания, могу и побить  ;D ;D ;D


Название: Re: Ересь с QFile
Отправлено: Bepec от Апрель 11, 2014, 12:00
Я факты привожу :D Молод был, горяч :D
Тогда было проще переписать, чем найти багу :D


Название: Re: Ересь с QFile
Отправлено: OKTA от Апрель 11, 2014, 12:13
Спасибо, буду искать)  ;)
Переписать ересь, которую я пишу сейчас уже само по себе ересь  ;D


Название: Re: Ересь с QFile
Отправлено: OKTA от Апрель 11, 2014, 12:45
О да, я нашел ошибку  8)
Библиотека, которую я использую, выделяла память через GlobalAlloc и в одном месте я по привычке сделал не GlobalFree, а delete  8)
Интересно конечно, как именно крошилась память при вызове QFileDialog, но это уже другой вопрос)

Кстати, сразу вопрос о QFile, точнее о QDataStream, который используется для записи в файл.
На сколько гуманно записывать структуры в поток через int QDataStream::writeRawData ( const char * s, int len )?
Учитывая, что я точно знаю размер структуры? Это ведь аналогично fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ) или я путаю?


Название: Re: Ересь с QFile
Отправлено: panAlexey от Апрель 11, 2014, 18:01
Сижу пока на Windows - не могу поюзать.
Видимо кучу повреждает QFileDialog  ??? Но вопрос, как он может это делать??
В одной из версий Qt под MinGW диалог открытия файла вел себя очень скверно.
В дебаге помнится даже софт вешал. какая-то из четвертой версии. 4.2.2 или 4.7.2.
Могу ошибиться в версии.


Название: Re: [РЕШЕНО] Ересь с QFile
Отправлено: OKTA от Апрель 11, 2014, 18:02
Сижу в 4.7.4, но тут QFileDialog оказался не виноват  :)