Название: [РЕШЕНО] Ересь с 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", Да и потоки не используются ??? Название: 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 - не могу поюзать. В одной из версий Qt под MinGW диалог открытия файла вел себя очень скверно.Видимо кучу повреждает QFileDialog ??? Но вопрос, как он может это делать?? В дебаге помнится даже софт вешал. какая-то из четвертой версии. 4.2.2 или 4.7.2. Могу ошибиться в версии. Название: Re: [РЕШЕНО] Ересь с QFile Отправлено: OKTA от Апрель 11, 2014, 18:02 Сижу в 4.7.4, но тут QFileDialog оказался не виноват :)
|