Название: Сегментация при очистке 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 код не могу представить, слишком много всего завязано. Эл-ты хранятся не поодиночке а группами (несколько в 1 блоке) чтобы не вызывать new/delete на каждый чихи да, почему вызывается явный деструктор через ~ а не через delete? |