|
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
|||||||||||
dynamic_cast не всегда работает правильно22.05.2022, 01:14. Показов 1549. Ответов 8
Метки нет (Все метки)
Помогите разобраться в проблеме. Есть большой проект, разбитый на разные библиотеки. В одной из библиотек конструируется объект (наследник от абстрактного класса). Дальше он передается в код другой библиотеки, которая в последствии, в нужный момент, вызывает
dynamic_cast для требуемого типа. На примере выглядит примерно так:common.lib
other.lib
dynamic_pointer_cast возвращает nullptr и то не всегда, например, каст может успешно пройти в дебаг сборке, а в релиз уже не проходит, или наоборот. При єтом, полиморфизм работает исправно (виртуальные методы вызываются правильно для нужного объекта).Подскажите, в какую сторону копать или что почитать по этому поводу.
0
|
|||||||||||
| 22.05.2022, 01:14 | |
|
Ответы с готовыми решениями:
8
Программа не всегда работает правильно Прога не всегда работает правильно.. Функция, описывающая массив, работает но не всегда правильно |
|
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
|
|
| 22.05.2022, 02:22 | |
|
0
|
|
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,058
|
|
| 22.05.2022, 12:34 | |
|
0
|
|
|
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
|||
| 22.05.2022, 13:19 [ТС] | |||
dynamic_cast. И, на других ОС он бы тоже затирался, а там все ок. Кода, который чего там шаманит в зависимости от ОС нет.Добавлено через 42 секунды Добавлено через 13 минут Весь проект компилируется одним компилятором (в зависимости от ОС) в несколько библиотек и бинарник. Забыл уточнить, проблема возникла после того как часть кода с common.lib переехала в еще одну отдельную либу. Иерархия классов AbstractClass при этом никак от нее не зависит.Добавлено через 3 минуты В месте dynamic_cast есть полная информация о типе. Можно даже успешно создавать новые объекты CustomClass. Да, и std::shared_ptr здесь тоже ни при чем, на голых указателях тоже самое происходит.
0
|
|||
|
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
|
|
| 22.05.2022, 19:12 | |
|
notAll, "Тоже так думал. Но адрес созданного объекта не меняется до самого dynamic_cast."
Затирается может не указатель на объект, а тело самого объекта. Объект содержит скрытый указатель по которому работает динамический каст. > И, на других ОС он бы тоже затирался, а там все ок. Кода, который чего там шаманит в зависимости от ОС нет. Разные компиляторы раскладывают память по-разному. Проверьте байты объекта.
1
|
|
|
19499 / 10104 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 23.05.2022, 16:49 | |
Сообщение было отмечено notAll как решение
Решение
notAll, лично у меня когда-то была подобная проблема и причина оказалась в наличии двух рантаймов С++ (двух копий) в одном адресном пространстве. Один рантайм линковался как обычно динамически, а другой был затянут с одной из библиотек (в нее он был вкомпилен статически).
В целом подобная проблема характерна для нарушения ODR. Я вам даю 99%, что и у вас причина в этом же.
1
|
|
|
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
|
| 25.05.2022, 12:19 [ТС] | |
|
DrOffset, а каким образом можно обнаружить такое (наличие двух рантаймов С++ (двух копий) в одном адресном пространстве)? Дебаггером или просто анализируя
cmake конфигурацию?
0
|
|
|
19499 / 10104 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||||
| 25.05.2022, 13:36 | ||||||
|
notAll, когда я говорил про 99%, я имел в виду в целом нарушение ODR, а не конкретное его проявление в том, что в программе два рантайма. У вас-то может быть в другом причина.
Найти два рантайма можно анализом скриптов сборки (если исходники доступны всех компонентов приложения). Или можно готовые бинарники проанализировать чем-то вроде nm, на предмет символов характерных для C++ runtime. _____________ Можно попробовать залогировать указатель np в разных библиотеках (по мере продвижения по контекcту вызовов):
1
|
||||||
|
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
|
|
| 25.05.2022, 18:25 | |
|
notAll, Проверьте байты объекта на сохранность.
Незачем залезать в дебри, если вы где-то просто память затерли. звук копыт это обычно лошади, не зебры.
0
|
|
| 25.05.2022, 18:25 | |
|
Помогаю со студенческими работами здесь
9
Частое использование dynamic_cast в конкретных целях. Правильно ли? Не всегда правильно работает scrollToItem()? Не всегда программа работает правильно Минимизация ФАЛ не всегда работает правильно Как работает dynamic_cast Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|