|
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
|||||||||||
dynamic_cast не всегда работает правильно22.05.2022, 01:14. Показов 1553. Ответов 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
|
|
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,097
|
|
| 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
|
|
|
19500 / 10105 / 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
|
|
|
19500 / 10105 / 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|