Сбой при связывании Debug-CRT в смеси статических и динамических библиотек?

У меня странная проблема, когда я страдаю от сбоев при удалении объектов в моем коде. Объекты действительны, нет утечек памяти, которые могли бы их перезаписать, и это происходит только в режиме отладки. Один и тот же код, скомпилированный с Linux, прекрасно работает как в отладочной, так и в выпускной сборках. Так что я предполагаю, что это какая-то странная проблема с отладочными CRT в Visual Studio.

Мое программное обеспечение структурировано следующим образом:

Две статические библиотеки скомпилированы в режиме «Многопоточная (отладочная) DLL» и связаны с:
Общая библиотека (DLL), которая компилируется в режиме «Многопоточный (отладка)». Из логики я бы сказал, что все должно быть наоборот, но тогда я получаю ОГРОМНОЕ количество неразрешенных символов.

Наконец, есть исполняемый файл, скомпилированный в режиме «Многопоточная (отладочная) DLL», который вызывает указанную выше DLL. Здесь не имеет значения, когда я переключаюсь на «Многопоточность (отладка)».

Сбой при удалении объекта происходит в dbgheap.c / _heap_alloc_dbg_impl () -> mlock.c / _unlock () — функция

Итак: в чем может быть проблема? Это действительно какая-то CRT-несовместимость в режиме отладки или в чем еще может быть причина? Я совершенно уверен, что это не типичная утечка памяти, так как она гладко работает с Linux и в сборке релиза.

1

Решение

Когда вы статически связываете библиотеки, вы должны обратить внимание, что вы используете так же ЭЛТ «Ароматизатор».

Когда вы используете DLL:

тогда вы можете использовать их из исполняемых файлов, созданных с разные вкусы ЭЛТ, или даже построен с разные версии компилятора VC ++.

Но если в ваших DLL есть классы C ++ (например, классы STL) на границах, то существуют строгие ограничения в отношении статических библиотек, то есть вы должны использовать так же Разновидности CRT (отладка или выпуск) динамически связаны для DLL и EXE, и как EXE, так и DLL должны быть собраны с так же компилятор и такие же настройки (как _HAS_ITERATOR_DEBUGGING).

1

Другие решения

Других решений пока нет …