Russian Qt Forum

Qt => Общие вопросы => Тема начата: xintrea от Сентябрь 28, 2015, 22:13



Название: Сегфолт в пустом деструкторе. Как исправить?
Отправлено: xintrea от Сентябрь 28, 2015, 22:13
Обнаружил, что у меня при выходе из Qt-программы происходит сегфолт. Qt 5.4.2.

Наблюдения:

* В обычной консоли при возникновении сегфолта пишется "Ошибка сегментирования".

* В консоли Qt Creator (видимо туда попадает std err) пишется:

Код:
*** Error in `.../build-mytetra-Desktop_Qt_5_4_2_GCC_32bit-Debug/bin/mytetra': free(): invalid pointer: 0x09b462f4 ***

* При отладке в Qt Creator сегфолт отлавливается, и выглядит на экране так:

http://i.piccy.info/i9/2fb9d1908658739fc0330dabca52be62/1443465704/349211/825956/scr_371.png

* Видно, что сегфолт происходит в пустом деструкторе, что для меня вообще непонятно.



Вопрос: как побороть сию проблему?


Код проекта: https://github.com/xintrea/mytetra_dev/tree/attachFiles

Вопроизведение: запустить программу, при первом запуске программа спросит режим работы - выбрать portable, выйти из программы.


Название: Re: Сегфолт в пустом деструкторе. Как исправить?
Отправлено: Alex Custov от Сентябрь 28, 2015, 22:17
классика ошибок работы с памятью. Либо двойное удаление указателя, либо использование неинициализированного указателя.


Название: Re: Сегфолт в пустом деструкторе. Как исправить?
Отправлено: xintrea от Сентябрь 28, 2015, 22:20
Все данные удаляемых объектов в стеке валидные.

После первого удаления объекта по указателю такое может быть?


Название: Re: Сегфолт в пустом деструкторе. Как исправить?
Отправлено: Bepec от Сентябрь 28, 2015, 22:39
Мб удаляешь объект, при этом имеющий родителя.

А на деле просто засунь туда вывод отладочный и посмотри сколько раз будет вызываться.


Название: Re: Сегфолт в пустом деструкторе. Как исправить?
Отправлено: xintrea от Сентябрь 28, 2015, 23:08
классика ошибок работы с памятью. Либо двойное удаление указателя, либо использование неинициализированного указателя.

Дебаг показал двойное удаление объекта записи. Первый раз удаляется когда удаляется вся структура всех записей, второй раз удаляется, когда удаляется текущая запись, с которой происходит работа.


Название: Re: Сегфолт в пустом деструкторе. Как исправить?
Отправлено: kambala от Сентябрь 29, 2015, 00:32
обнуляй указатель после удаления. или используй умные указатели.


Название: Re: Сегфолт в пустом деструкторе. Как исправить?
Отправлено: Old от Сентябрь 29, 2015, 03:57
Мб удаляешь объект, при этом имеющий родителя.
Ну и что, это не приводит к повторному удалению.


Название: Re: Сегфолт в пустом деструкторе. Как исправить?
Отправлено: qate от Сентябрь 29, 2015, 08:56
без вызова setupDataFromDom падает ?


Название: Re: Сегфолт в пустом деструкторе. Как исправить?
Отправлено: xintrea от Сентябрь 29, 2015, 10:30
без вызова setupDataFromDom падает ?

Уже исправил. Проблема была в двойном удалении указателя. Я в приступе перфекционизма стал прописывать в деструкторах удаление всех указателей, расположенных в интерфейсе, забыв что если в интерфейсе есть указатель, это не значит что память выделяется именно в этом классе.


Название: Re: Сегфолт в пустом деструкторе. Как исправить?
Отправлено: Old от Сентябрь 29, 2015, 10:42
Уже исправил. Проблема была в двойном удалении указателя. Я в приступе перфекционизма стал прописывать в деструкторах удаление всех указателей, расположенных в интерфейсе, забыв что если в интерфейсе есть указатель, это не значит что память выделяется именно в этом классе.
Умные указатели подпрыгивают с поднятой рукой... :)