Russian Qt Forum
Ноябрь 28, 2024, 05:30
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Сегментация при очистке QVariantMap
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Сегментация при очистке QVariantMap (Прочитано 6532 раз)
Fregloin
Супер
Offline
Сообщений: 1025
Сегментация при очистке QVariantMap
«
:
Март 23, 2015, 12:24 »
привет. столкнулся с таким багом.
В плагине есть QVariantMap. В него копируются некие данные. В частности пара QString("items"):QList<QObject*>().
При попытке очистить мапу получаю сегментацию. Вывод отладчика прилагаю в картинке. Копирование новых элементов не вызывает сегментации.
При чем падает если вызывать явно clear(), или неявно в деструкторе плагина.
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Сегментация при очистке QVariantMap
«
Ответ #1 :
Март 23, 2015, 12:58 »
Поменял на std::map - тоже вылет!
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Сегментация при очистке QVariantMap
«
Ответ #2 :
Март 23, 2015, 13:02 »
Очень похоже на повторное удаление
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Сегментация при очистке QVariantMap
«
Ответ #3 :
Март 23, 2015, 13:05 »
QMap я распологаю в стеке а не в куче.
Записан
Bepec
Гость
Re: Сегментация при очистке QVariantMap
«
Ответ #4 :
Март 23, 2015, 15:48 »
Я могу сказать крылатую фразу. Нет кода - нет проблемы. Есть код - есть проблема
PS минимально компилябельный пример в студию.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Сегментация при очистке QVariantMap
«
Ответ #5 :
Март 23, 2015, 16:50 »
Цитата: Fregloin от Март 23, 2015, 13:05
QMap я распологаю в стеке а не в куче.
Без разницы, вылет на удалении элемента, а он всегда в куче. Вероятно Вы его уже грохнули раньше. Ставьте печать в деструктор CAttachDoc (как я понял это он)
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Сегментация при очистке QVariantMap
«
Ответ #6 :
Март 23, 2015, 18:10 »
я вот не пойму, если я храню в списке указатели, при удалении списка вызываются деструкторы для этих указателей? хм, а как быть если мне нужен временный список указателей, но объекты на которые они указывают удалать не надо... не пойму, всегда думал что список хранит указатель просто как данные..
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: Сегментация при очистке QVariantMap
«
Ответ #7 :
Март 23, 2015, 18:45 »
Цитата: Fregloin от Март 23, 2015, 18:10
я вот не пойму, если я храню в списке указатели, при удалении списка вызываются деструкторы для этих указателей? хм, а как быть если мне нужен временный список указателей, но объекты на которые они указывают удалать не надо... не пойму, всегда думал что список хранит указатель просто как данные..
Он и хранит. Ошибки на пустом месте при использовании new/delete/стека почти 100% связаны с битой памятью (двойное удаление, неинициализированный указатель и т.п.) ГДЕ УГОДНО РАНЕЕ. Нужно или глазами искать ошибку или статическим/динамическим анализатором типа valrgind.
Как обычно, в качестве доказательства гипотезы, можно написать простейший пример, и падать он не будет.
«
Последнее редактирование: Март 23, 2015, 18:49 от Alex Custov
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Сегментация при очистке QVariantMap
«
Ответ #8 :
Март 23, 2015, 19:44 »
Выясните на удалении какого объекта это случается. Напр QList <QObject *> - ну и вцепитесь в него. Напр перед очисткой мапы попробуйте ее попечатать qDebug(). Летит - на каком эл-те? И.т.д. Если баг стабильно торчит - все просто
Записан
Bepec
Гость
Re: Сегментация при очистке QVariantMap
«
Ответ #9 :
Март 23, 2015, 21:49 »
А самый простой способ - сделать минимально компиляберный пример. Если выдаст ошибку и он - проблема в контейнере. А если нет - проблема в остальном коде в вашем проекте.
Первое действие при ошибке - локализовать её.
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Сегментация при очистке QVariantMap
«
Ответ #10 :
Март 24, 2015, 09:48 »
короче вот что я выяснил. Если очищать память в мапе до удаления плагина, то все окей, а если плагин удаляется позже всего остального (кстати странно, так как unload я вызываю явно намного раньше удаления тех объектов, которые хранятся в списке), то прога падает. Т.е. плагин не удаляется из памяти сразу по вызову unload, и соотвественно объекты в плагине тоже. К сожалению instance() плагина удалять через delete напрямую не рекомендуется в доках. Впрочем проблему решил по другому, объявил явный метод очистки мапы и вызываю его перед удалением хранимых объектов.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Сегментация при очистке QVariantMap
«
Ответ #11 :
Март 24, 2015, 11:55 »
Цитата: Fregloin от Март 24, 2015, 09:48
...Впрочем проблему решил по другому, объявил явный метод очистки мапы и вызываю его перед удалением хранимых объектов.
Но ведь Вы хранили не сами объекты а указатели на них? Впрочем да, без кода это гадание на кофейной гуще
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Сегментация при очистке QVariantMap
«
Ответ #12 :
Март 24, 2015, 14:58 »
код не могу представить, слишком много всего завязано.
и да, почему вызывается явный деструктор через ~ а не через delete?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Сегментация при очистке QVariantMap
«
Ответ #13 :
Март 24, 2015, 15:05 »
Цитата: Fregloin от Март 24, 2015, 14:58
код не могу представить, слишком много всего завязано.
и да, почему вызывается явный деструктор через ~ а не через delete?
Эл-ты хранятся не поодиночке а группами (несколько в 1 блоке) чтобы не вызывать new/delete на каждый чих
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...