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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сегментация при очистке QVariantMap  (Прочитано 6192 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Март 23, 2015, 12:24 »

привет. столкнулся с таким багом.
В плагине есть QVariantMap. В него копируются некие данные. В частности пара QString("items"):QList<QObject*>().

При попытке очистить мапу получаю сегментацию. Вывод отладчика прилагаю в картинке. Копирование новых элементов не вызывает сегментации.
При чем падает если вызывать явно clear(), или неявно в деструкторе плагина.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Март 23, 2015, 12:58 »

Поменял на std::map - тоже вылет!  Непонимающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Март 23, 2015, 13:02 »

Очень похоже на повторное удаление
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Март 23, 2015, 13:05 »

QMap я распологаю в стеке а не в куче.
Записан
Bepec
Гость
« Ответ #4 : Март 23, 2015, 15:48 »

Я могу сказать крылатую фразу. Нет кода - нет проблемы. Есть код - есть проблема Улыбающийся

PS минимально компилябельный пример в студию.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 23, 2015, 16:50 »

QMap я распологаю в стеке а не в куче.
Без разницы, вылет на удалении элемента, а он всегда в куче. Вероятно Вы его уже грохнули раньше. Ставьте печать в деструктор CAttachDoc (как я понял это он)
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #6 : Март 23, 2015, 18:10 »

я вот не пойму, если я храню в списке указатели, при удалении списка вызываются деструкторы для этих указателей? хм, а как быть если мне нужен временный список указателей, но объекты на которые они указывают удалать не надо... не пойму, всегда думал что список хранит указатель просто как данные..
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Март 23, 2015, 18:45 »

я вот не пойму, если я храню в списке указатели, при удалении списка вызываются деструкторы для этих указателей? хм, а как быть если мне нужен временный список указателей, но объекты на которые они указывают удалать не надо... не пойму, всегда думал что список хранит указатель просто как данные..

Он и хранит. Ошибки на пустом месте при использовании new/delete/стека почти 100% связаны с битой памятью (двойное удаление, неинициализированный указатель и т.п.) ГДЕ УГОДНО РАНЕЕ. Нужно или глазами искать ошибку или статическим/динамическим анализатором типа valrgind.

Как обычно, в качестве доказательства гипотезы, можно написать простейший пример, и падать он не будет.
« Последнее редактирование: Март 23, 2015, 18:49 от Alex Custov » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Март 23, 2015, 19:44 »

Выясните на удалении какого объекта это случается. Напр QList <QObject *> - ну и вцепитесь в него. Напр перед очисткой мапы попробуйте ее попечатать qDebug(). Летит - на каком эл-те? И.т.д. Если баг стабильно торчит - все просто
Записан
Bepec
Гость
« Ответ #9 : Март 23, 2015, 21:49 »

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

Первое действие при ошибке - локализовать её.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #10 : Март 24, 2015, 09:48 »

короче вот что я выяснил. Если очищать память в мапе до удаления плагина, то все окей, а если плагин удаляется позже всего остального (кстати странно, так как unload я вызываю явно намного раньше удаления тех объектов, которые хранятся в списке), то прога падает. Т.е. плагин не удаляется из памяти сразу по вызову unload, и соотвественно объекты в плагине тоже. К сожалению instance() плагина удалять через delete напрямую не рекомендуется в доках. Впрочем проблему решил по другому, объявил явный метод очистки мапы и вызываю его перед удалением хранимых объектов.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 24, 2015, 11:55 »

...Впрочем проблему решил по другому, объявил явный метод очистки мапы и вызываю его перед удалением хранимых объектов.
Но ведь Вы хранили не сами объекты а указатели на них? Впрочем да, без кода это гадание на кофейной гуще
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #12 : Март 24, 2015, 14:58 »

код не могу представить, слишком много всего завязано.
и да, почему вызывается явный деструктор через ~ а не через delete?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Март 24, 2015, 15:05 »

код не могу представить, слишком много всего завязано.
и да, почему вызывается явный деструктор через ~ а не через delete?
Эл-ты хранятся не поодиночке а группами (несколько в 1 блоке) чтобы не вызывать new/delete на каждый чих
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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