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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сегфолт в пустом деструкторе. Как исправить?  (Прочитано 5299 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Сентябрь 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, выйти из программы.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Сентябрь 28, 2015, 22:17 »

классика ошибок работы с памятью. Либо двойное удаление указателя, либо использование неинициализированного указателя.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Сентябрь 28, 2015, 22:20 »

Все данные удаляемых объектов в стеке валидные.

После первого удаления объекта по указателю такое может быть?
« Последнее редактирование: Сентябрь 28, 2015, 22:24 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
Bepec
Гость
« Ответ #3 : Сентябрь 28, 2015, 22:39 »

Мб удаляешь объект, при этом имеющий родителя.

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

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Сентябрь 28, 2015, 23:08 »

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

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

Собираю информацию по крупицам
http://webhamster.ru
kambala
Джедай : наставник для всех
*******
Online Online

Сообщений: 4727



Просмотр профиля WWW
« Ответ #5 : Сентябрь 29, 2015, 00:32 »

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #6 : Сентябрь 29, 2015, 03:57 »

Мб удаляешь объект, при этом имеющий родителя.
Ну и что, это не приводит к повторному удалению.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #7 : Сентябрь 29, 2015, 08:56 »

без вызова setupDataFromDom падает ?
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #8 : Сентябрь 29, 2015, 10:30 »

без вызова setupDataFromDom падает ?

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

Собираю информацию по крупицам
http://webhamster.ru
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #9 : Сентябрь 29, 2015, 10:42 »

Уже исправил. Проблема была в двойном удалении указателя. Я в приступе перфекционизма стал прописывать в деструкторах удаление всех указателей, расположенных в интерфейсе, забыв что если в интерфейсе есть указатель, это не значит что память выделяется именно в этом классе.
Умные указатели подпрыгивают с поднятой рукой... Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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