在std :: locale析构函数中退出时崩溃

时间:2013-02-10 02:36:45

标签: c++ c winapi

我正在使用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和多字节设置之间来回切换似乎不会影响发布时退出时的崩溃。

有谁知道发生了什么事?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。有一些全局变量调用new,我有新的重载。当第一次调用new时,将构造自定义内存管理器。这很好,但是在程序关闭时,一些对象在内存管理器之后就会破坏。破坏的顺序是导致问题的原因。