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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сегментация при очистке QVariantMap  (Прочитано 6745 раз)
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.033 секунд. Запросов: 22.