У меня странная проблема, когда я страдаю от сбоев при удалении объектов в моем коде. Объекты действительны, нет утечек памяти, которые могли бы их перезаписать, и это происходит только в режиме отладки. Один и тот же код, скомпилированный с Linux, прекрасно работает как в отладочной, так и в выпускной сборках. Так что я предполагаю, что это какая-то странная проблема с отладочными CRT в Visual Studio.
Мое программное обеспечение структурировано следующим образом:
Две статические библиотеки скомпилированы в режиме «Многопоточная (отладочная) DLL» и связаны с:
Общая библиотека (DLL), которая компилируется в режиме «Многопоточный (отладка)». Из логики я бы сказал, что все должно быть наоборот, но тогда я получаю ОГРОМНОЕ количество неразрешенных символов.
Наконец, есть исполняемый файл, скомпилированный в режиме «Многопоточная (отладочная) DLL», который вызывает указанную выше DLL. Здесь не имеет значения, когда я переключаюсь на «Многопоточность (отладка)».
Сбой при удалении объекта происходит в dbgheap.c / _heap_alloc_dbg_impl () -> mlock.c / _unlock () — функция
Итак: в чем может быть проблема? Это действительно какая-то CRT-несовместимость в режиме отладки или в чем еще может быть причина? Я совершенно уверен, что это не типичная утечка памяти, так как она гладко работает с Linux и в сборке релиза.
Когда вы статически связываете библиотеки, вы должны обратить внимание, что вы используете так же ЭЛТ «Ароматизатор».
Когда вы используете DLL:
если они выставляют интерфейс pure-C (например, на границах нет классов STL) а также вы убедитесь, что выделение и освобождение памяти выполняются внутри библиотечного кода (или, в более общем случае, и клиент, и библиотека используют один и тот же распределитель)
или если они COM библиотеки DLL
тогда вы можете использовать их из исполняемых файлов, созданных с разные вкусы ЭЛТ, или даже построен с разные версии компилятора VC ++.
Но если в ваших DLL есть классы C ++ (например, классы STL) на границах, то существуют строгие ограничения в отношении статических библиотек, то есть вы должны использовать так же Разновидности CRT (отладка или выпуск) динамически связаны для DLL и EXE, и как EXE, так и DLL должны быть собраны с так же компилятор и такие же настройки (как _HAS_ITERATOR_DEBUGGING
).
Других решений пока нет …