Первый, принятый, ответ правильный, но он не показывает точно причину и, следовательно, способ ее устранения. Согласно перечисленной части стека вызовов, я столкнулся с той же проблемой с VC ++ 8 (MS VS 2005), но в другом случае: моя CLR DLL вызвала AV в той же точке кода.
Из перечисленного стека вызовов видно, что вызывается код <xdebug>
, который обычно компилируется в msvc * .dll, но в этот момент _Ptr
уже имеет неправильное значение. Следовательно, есть некоторый код, который либо уже освободил объект под этим указателем, либо установил выходной хук для освобождения неинициализированного объекта.
Если определено _STATIC_CPPLIB
, код <xdebug>
может быть применен к другим модулям, которые загружаются в процесс приложения. Затем одна процедура выхода из этих модулей может быть вызвана до другой в msvcp100d.dll и, таким образом, обычно может освободить объект фасета. В моем случае, с определением _STATIC_CPPLIB
, оба модуля (exe и clr dll) были скомпилированы.
Решение для VC ++ 8,9
Проверьте окончательные параметры компилятора в разделе «Командная строка» на наличие /D "_STATIC_CPPLIB"
. Отмена определения _STATIC_CPPLIB
и перекомпиляция затронутых модулей исправляет AV при завершении программы.
Примечание на
_STATIC_CPPLIB
Для VC ++ 9 _STATIC_CPPLIB
, на MSDN есть примечание, что
комбинация определения препроцессора _STATIC_CPPLIB
и
/clr
или /clr:pure
опция компилятора не поддерживается.
И на _STATIC_CPPLIB
нет упоминаний для более высоких версий VS.
Для более высоких версий VS и VS 10, в частности, я предполагаю, что код, зависящий от _STATIC_CPPLIB
, все еще существует. В случае TS, если _STATIC_CPPLIB
все еще используется в опциях компилятора любого TU, который включает <string>
или другие заголовки, включая <locale>
, эта неправильная комбинация может привести к AV.