我正在使用 Visual Studio 2010 在 C++ 中开发 Win32 应用程序。在调试模式下运行时,应用程序运行良好并在退出时正确关闭。然而,在发布时,程序运行良好,但在应用程序关闭时出现未处理的异常:Application.exe 中 0x009C19F5 处的未处理异常:0xC0000005:访问冲突读取位置 0x00297628。
然后调试器在 std::local 的析构函数中中断 xlocale:
~locale() _THROW0()
{ // destroy the object
if (_Ptr != 0)
_DELETE_CRT(_Ptr->_Decref()); // breaks here with unhandled exception
}
我相信,在我的 main 函数返回并在某处调用 exit(0) 之后,上面的代码正在运行。这是我崩溃时的调用堆栈:
Application.exe!std::locale::~locale() Line 411 C++
Application.exe!doexit(int code, int quick, int retcaller) Line 567 C
Application.exe!exit(int code) Line 393 C
Application.exe!__tmainCRTStartup() Line 284 C
kernel32.dll!@BaseThreadInitThunk@12() Unknown
ntdll.dll!___RtlUserThreadStart@8() Unknown
ntdll.dll!__RtlUserThreadStart@8() Unknown
我正在使用 Microsoft 的应用程序验证程序,并且正在运行 _CrtCheckMemory( ); 经常检查堆损坏,我没有看到在调试或发布模式下检测到任何东西。在我的任何来源中,我也根本没有弄乱 std::locale 。
我最近将解决方案的设置切换为默认使用 unicode 而不是 256 个一字节大小的字符。但是,现在在 unicode 和多字节设置之间来回切换似乎不会影响发布时退出时的崩溃。
有谁知道发生了什么?