дебажной и релизной сборкой?Например, релизный exe загружает дебажнуюю длл, получает из нее std::string, а она битая.
Я полистал исходники - не вижу ifdef, который мог бы такое делать, но там многие тысячи строк кода и шаблон на шаблоне.
Известный факт, что дебажные и релизные std классы в MSVC бинарно несовместимы в большинстве своём
Это очень коварно, а нет дефайна, который этим управляет?
Просто принять и не делать так
Вообще-то совместима, но тут проблема в том что если у тебя в одном приложении используется одновременно и отладочная версия стандартной библиотеки и релизная, то это нарушение One definition rule и программа автоматом некорректна
Не уверен, что это так работает, определения в разных exe / dll независимы. А строка вообще шаблонная.
Очень коварно нарушать одт и мешать две стандартные библиотеки...
А я уверен что это работает именно так и тебя могу заверить что это работает именно так
Шаблонная строка или нет Это неважно, она по стандарту языка должна быть во всей программе определена единственным образом а если это не так то это неопределённое поведение. Определение в разных exe и dll могут быть независимыми но в рамках одного приложения Они обязаны быть одинаковыми. Иначе будет неопределённое поведение на которое ты и наталкиваешься и оно тебе дают по зубам Ну и поделом!
Да, только причина не в нарушении ODR, а в разном ABI
Нет и это именно нарушение одр
Единственным образом, но не один раз. ODR ни при чем.
Дорогой это оно и есть, ODR, не единственным образом, а тупо одинаково
Так-то, просто хочу напомнить, ты любой объект или тип программы на c++ или C и так в каждой единице трансляции определяешь заново, то есть ни в одной программе на си или си плюс плюс правила определения чего-то ровно один раз и не больше не может быть потому что у нас есть многофайловая сборка, раздельная трансляция
много раз можно только с internal linkage, а иначе - только один раз на весь бинарник, а не один раз на TU.
Давай лучше перейдём к практическую плоскость и решим твою проблему а решение должно быть в том что ты должен собирать всю свою программу либо в режиме сборки релиз либо в режиме сборки дебаг либо ещё как-то но всегда одинаково всю программу целиком со всеми библиотеками со всеми модулями бинарными
Ты не прав, ты путаешь помещение объектов в словарь глобальных ссылок с определением объектов и типов программы. Это разные вещи. И даже более, то о чём ты говоришь оно диагностируемо по большей части То есть ты получишь в случае нарушения ошибку не всегда но там скажем 80% случаев А вот нарушение одр наоборот почти никогда не диагностируемо
Получается IFNDR?
Там итераторы на дебаге другие
Обсуждают сегодня