小さなプロジェクトで、いくつかのブースト パッケージ (asio、property_tree、filesystem など) を使用していますが、ブースト パッケージのどこかで例外がスローされるまで、すべてが正常に機能することに注意する必要がありました。これらすべてのパッケージで発生しますが、次の最小限のプログラムに要約することができました。
#include <iostream>
#include "boost/throw_exception.hpp"
int main(int argc, char* argv[])
{
boost::throw_exception(std::exception("foo")); // <-- this will produce the problem
throw std::exception("foo"); // <-- this works as expected
return 0;
}
例外は正常にスローされますが、プログラムが終了すると取得されます
Run-Time Check Failure #0 - The value of ESP was not properly
saved across a function call ...
私はこれをデバッグしようとしました (私はビジュアル スタジオ 2010 Express でブースト 1.49.0 を使用し、crt を静的にリンクしています)、すべての可視コードが既に実行されている場合に問題が発生します。std:exception デストラクタが通過しなかったことがわかりますが、その後 (プログラムの return ステートメントの "in" で) メッセージ ボックスがトリガーされます。
編集:いくつかの追加情報:
- 上記の最小限のプログラムでは、boost はヘッダーのみを使用しています
- 他の lib ファイルは関係ありません
- プログラムによって読み込まれるのは、ntdll.dll と kernel32.dll だけです。
- 追加のスレッドは作成されていません
- CRTに対して動的にリンクすると、問題も発生します
EDIT2:再び詳細情報:
- 上記のプログラムに追加されたインクルード
- 代わりに runtime_error をスローすると、問題も発生します
- (...) または (std::exception) で例外をキャッチすると、問題は解決します
- 例外を再スローすると、問題は解決したままです