1

小さなプロジェクトで、いくつかのブースト パッケージ (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) で例外をキャッチすると、問題は解決します
  • 例外を再スローすると、問題は解決したままです
4

1 に答える 1

0

動的ランタイムを使用して、Boost とプログラムの両方が同じものを使用できるようにできますか? ランタイムに静的にリンクしている場合、2 つのランタイムがプロセスにロードされている可能性があり、これが問題を引き起こす可能性があります。前回この問題を見たときは、プログラムと DLL (cdecl/fastcall/pascal など) の間で呼び出し規則が異なることが原因でした。ただし、静的ランタイムを使用するだけでは違いはありません。

ところで:エラーがどこにあるかを見つけるために行うことができる簡単なテストがあります。Boost の適切なコードをプログラムに含めると、効果的にインプレース コンパイルされ、静的にリンクされた Boost が得られます。それが機能する場合、問題はビルドまたはリンクの方法にあると合理的に確信できます。

于 2013-07-12T05:15:20.313 に答える