![]() |
|
Модераторы: bsa |
![]()
|
|
| ChipNDale |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 11.6.2010 Репутация: нет Всего: 1 |
Приветствую.
Столкнулся с проблемой, которую даже не знаю как адекватно сформулировать, поэтому сейчас будет поток сознания. Если коротко: программа падает. Подробнее. Повсеместно используются умные указатели (std::shared_ptr и std::unique_ptr). Имеется некоторая вложенность объектов, которая примерно выглядит так:
Усугубляется это безобразие тем, объекты shared_ptr<Job> создаются в коде библиотеке, загружаемой во время выполнения и в сам контейнер попадают не сразу же, а пройдя еще через некоторые методы-объекты-контейнеры. В общем, не вижу смысла приводить тут весь код: никто в здравом уме не будет разбираться во всей системе. В то же время не удалось написать короткий пример для воспроизведения проблемы. Собственно, вопрос: если кто-нибудь сталкивался с падениями при использвании умных указателей, как вообще подходить к отладке и на что смотреть? Максимум, что я понял из бэктрейса, падение происходит где-то в деструкторе Queue при уничтожении его контейнера шаред поинтеров. Все дальнейшее мне мало о чем говорит, но все-таки ниже приложу сам бэктрейс. В деструкторе Queue пробегался по всем объектам из контейнера и смотрел use_count - везде единички. Временное решение проблемы - вектор указателей заменить на вектор объектов, для Job убрать наследование от boost::noncopyable. Бэктрейс:
Это сообщение отредактировал(а) ChipNDale - 13.2.2013, 17:36 |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Библиотека откомпилирована тем же компилятором, что и основное приложение ? С теми же опциями компиляции ? С теми же STL-ными h-никами ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| ChipNDale |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 11.6.2010 Репутация: нет Всего: 1 |
Да, тут весь код свой, в одном "солюшне", соответственно компилятор один и его флаги задаются глобально в единственном месте.
Добавлено @ 18:03 Эм... Сейчас наугад удалил одну строчку, внезапно сегфолт пропал. Детали такие: Job находится в библиотеке, которая статически линкуется с основным приложением. Приложение во время выполнения загружает динамическую библиотеку из которой получает фабрику для этих Job'ов. А убрал я закрытие библиотеки с этой самой фабрикой. Т.е. закрывать-то ее по-хорошему, надо, но, кажется, что если это происходит до уничтожения объекта Job, то происходит такое падение. И мне пока не ясно почему так. Upd: проверил теорию. Да, если сначала уничтожить все созданные объекты, а только потом закрыть загруженные библиотеки, то работает корректно. Но вопрос "почему так происходит" все еще актуален. Это сообщение отредактировал(а) ChipNDale - 13.2.2013, 18:11 |
|||
|
||||
| ChipNDale |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 11.6.2010 Репутация: нет Всего: 1 |
Вот такой получился пример для воспроизведения.
main.cpp:
factory.cpp:
Компиляция:
Запуск:
|
||||||||
|
|||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
есть простое правило, кто создал, тот удаляет..
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 1 Всего: 110 |
подозреваю, что если в DLL'ке CRT используется, как статическая библиотека, то и куча создаётся на эту DLL'ку, и умирает с её выгрузкой
если же CRT используется, как DLL всеми модулями, думаю, одной причиной для падения будет меньше Добавлено через 1 минуту и 9 секунд хм... перечитал, понял, что не для Visual Studio, но для другой платформы/инструментов может тоже такое быть -------------------- qqq |
|||
|
||||
| ChipNDale |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 11.6.2010 Репутация: нет Всего: 1 |
Если бы использовались разные компиляторы или несогласованные способы выделения/освобождения памяти, то согласен - это поможет защититься. В моем же случае таких разногласий нет и я использую смарт поинтеры как раз для того, чтобы не приходилось следить за временем жизни каждого отдельного объекта.
Вероятно, что-то такое и происходит. А можно ли с помощью чего-нибудь посмотреть и получить более-менее наглядную картину? (а пока попробую потерзать гугл сомнительными запросами) |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Посмотрите objdump'ом и ldd, где находятся new/delete/malloc/free в основной программе и в .so модуле. Если они у каждого локальные - будут проблемы. Если берутся из одной и той же внешней .so - то проблем быть не должно Еще можно глянуть в реализацию shared_ptr<> - что именно используется для удаления объекта (подозреваю, что банальный delete, но кто знает ... ) |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |