Russian Qt Forum

Qt => Общие вопросы => Тема начата: Fregloin от Март 23, 2015, 12:24



Название: Сегментация при очистке QVariantMap
Отправлено: Fregloin от Март 23, 2015, 12:24
привет. столкнулся с таким багом.
В плагине есть QVariantMap. В него копируются некие данные. В частности пара QString("items"):QList<QObject*>().

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


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Fregloin от Март 23, 2015, 12:58
Поменял на std::map - тоже вылет!  ???


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Igors от Март 23, 2015, 13:02
Очень похоже на повторное удаление


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Fregloin от Март 23, 2015, 13:05
QMap я распологаю в стеке а не в куче.


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Bepec от Март 23, 2015, 15:48
Я могу сказать крылатую фразу. Нет кода - нет проблемы. Есть код - есть проблема :)

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


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Igors от Март 23, 2015, 16:50
QMap я распологаю в стеке а не в куче.
Без разницы, вылет на удалении элемента, а он всегда в куче. Вероятно Вы его уже грохнули раньше. Ставьте печать в деструктор CAttachDoc (как я понял это он)


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Fregloin от Март 23, 2015, 18:10
я вот не пойму, если я храню в списке указатели, при удалении списка вызываются деструкторы для этих указателей? хм, а как быть если мне нужен временный список указателей, но объекты на которые они указывают удалать не надо... не пойму, всегда думал что список хранит указатель просто как данные..


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Alex Custov от Март 23, 2015, 18:45
я вот не пойму, если я храню в списке указатели, при удалении списка вызываются деструкторы для этих указателей? хм, а как быть если мне нужен временный список указателей, но объекты на которые они указывают удалать не надо... не пойму, всегда думал что список хранит указатель просто как данные..

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

Как обычно, в качестве доказательства гипотезы, можно написать простейший пример, и падать он не будет.


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Igors от Март 23, 2015, 19:44
Выясните на удалении какого объекта это случается. Напр QList <QObject *> - ну и вцепитесь в него. Напр перед очисткой мапы попробуйте ее попечатать qDebug(). Летит - на каком эл-те? И.т.д. Если баг стабильно торчит - все просто


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Bepec от Март 23, 2015, 21:49
А самый простой способ - сделать минимально компиляберный пример. Если выдаст ошибку и он - проблема в контейнере. А если нет - проблема в остальном коде в вашем проекте.

Первое действие при ошибке - локализовать её.


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Fregloin от Март 24, 2015, 09:48
короче вот что я выяснил. Если очищать память в мапе до удаления плагина, то все окей, а если плагин удаляется позже всего остального (кстати странно, так как unload я вызываю явно намного раньше удаления тех объектов, которые хранятся в списке), то прога падает. Т.е. плагин не удаляется из памяти сразу по вызову unload, и соотвественно объекты в плагине тоже. К сожалению instance() плагина удалять через delete напрямую не рекомендуется в доках. Впрочем проблему решил по другому, объявил явный метод очистки мапы и вызываю его перед удалением хранимых объектов.


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Igors от Март 24, 2015, 11:55
...Впрочем проблему решил по другому, объявил явный метод очистки мапы и вызываю его перед удалением хранимых объектов.
Но ведь Вы хранили не сами объекты а указатели на них? Впрочем да, без кода это гадание на кофейной гуще


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Fregloin от Март 24, 2015, 14:58
код не могу представить, слишком много всего завязано.
и да, почему вызывается явный деструктор через ~ а не через delete?


Название: Re: Сегментация при очистке QVariantMap
Отправлено: Igors от Март 24, 2015, 15:05
код не могу представить, слишком много всего завязано.
и да, почему вызывается явный деструктор через ~ а не через delete?
Эл-ты хранятся не поодиночке а группами (несколько в 1 блоке) чтобы не вызывать new/delete на каждый чих