1

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 を使用するようにしました。ただし、ユニコード設定とマルチバイト設定を切り替えても、リリースの終了時のクラッシュには影響しないようです。

何が起こっているのか誰にも分かりませんか?

4

2 に答える 2

0

私は解決策を見つけました。new を呼び出すグローバル変数がいくつかあり、new をオーバーロードしています。new が初めて呼び出されると、カスタム メモリ マネージャーが構築されます。これは問題ありませんが、プログラムを閉じると、メモリ マネージャーが破棄した後に一部のオブジェクトが破棄されます。破壊の順序が問題の原因でした。

于 2013-03-04T04:39:40.057 に答える