Visual Studio 2010 を使用して C++ で Win32 アプリケーションを作成しています。デバッグ モードで実行すると、アプリケーションは正常に動作し、終了時に適切に閉じます。ただし、リリースでは、プログラムは正常に実行されますが、アプリケーションを閉じると、未処理の例外が発生します。
次に、デバッガーは std::local のデストラクタの xlocale 内で中断します。
~locale() _THROW0()
{ // destroy the object
if (_Ptr != 0)
_DELETE_CRT(_Ptr->_Decref()); // breaks here with unhandled exception
}
上記のコードは、メイン関数が戻り、 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 をいじっていません。
最近、ソリューションの設定を変更して、デフォルトで 256 個の 1 バイト サイズの文字ではなく Unicode を使用するようにしました。ただし、ユニコード設定とマルチバイト設定を切り替えても、リリースの終了時のクラッシュには影響しないようです。
何が起こっているのか誰にも分かりませんか?