1

リリース時に、未処理の例外でクラッシュします: std::length エラー。

コール スタックは次のようになります。

msvcr90.dll!__set_flsgetvalue()  Line 256 + 0xc bytes   C
msvcr90.dll!__set_flsgetvalue()  Line 256 + 0xc bytes   C
msvcr90.dll!_getptd_noexit()  Line 616 + 0x7 bytes  C
msvcr90.dll!_getptd()  Line 641 + 0x5 bytes C
msvcr90.dll!rand()  Line 68 C
NEM.exe!CGAL::Random::Random()  + 0x34 bytes    C++
msvcr90.dll!_initterm(void (void)* * pfbegin=0x00000003, void (void)* * pfend=0x00345560)  Line 903 C
NEM.exe!__tmainCRTStartup()  Line 582 + 0x17 bytes  C
kernel32.dll!7c817067()     

手がかりはありますか?

4

4 に答える 4

3

スタックダンプの調査:

InitTermは、他の関数のリストをウォークし、それぞれをステップで実行する単純な関数です。これは、特に、グローバルコンストラクター(起動時)、グローバルデストラクタ(シャットダウン時)、およびatexitリスト(シャットダウン時)に使用されます。

スタックダンプ内のそれは、CGALがそのタイプCGAL::Random::Randomと呼ばれるグローバル変数を定義しているという事実によるため、CGALとリンクしています。これが、メインの前にエラーが発生している理由です。default_randomCGAL::Random::Randomdefault_random

CGALソースから、標準Cを呼び出し、srand(time(NULL))続いてローカルget_intを呼び出します。ローカルは、標準Crand()を呼び出して乱数を取得します。

ただし、スタックダンプはまだ内にあるため、第2段階には到達していませんsrand()

スレッドを遅延してファイバーに変換しているようです。つまり、スレッドで何かをしようとしたのはこれが初めてであり、続行する前にファイバーローカルストレージをセットアップする必要があります。

それで、試して調査することがいくつかあります。

1 / XPより前でこのコードを実行していますか?__set_flsgetvalueXPではファイバーローカルストレージ( )が導入されたと思います。これはロングショットですが、とにかくそれをクリアする必要があります。

2 / CGALとリンクする必要がありますか?アプリケーションにはCGALライブラリに何かが必要だと思いますが、そうでない場合はリンクしないでください。別のプロジェクトファイルからの二日酔いである可能性があります。

3 / CGALを使用する場合、最新バージョンを使用していることを確認してください。3.3以降、動的リンクをサポートしているため、異なるライブラリバージョン(静的/動的およびデバッグ/非デバッグの両方)が混在する可能性を防ぐことができます。

4 /VC8でコンパイルしてみてください。CGALがサポートするプラットフォームには、VC9(VS2008)はまだ含まれていません。CGALチーム自体がこれをフォローアップして、そのサポートに取り組んでいるかどうかを確認する必要がある場合があります。

5 /そして最後に、Boostをインストールしましたか?それは別のロングショットですが、とにかく一見の価値があります。

これらの提案のいずれも役に立たない場合は、私よりも知識のある人が来るのを待つ必要があります。恐れ入ります。

幸運を祈ります。

于 2008-12-02T05:53:02.930 に答える
0

受け取ったエラーについて具体的に教えてください。(未処理の例外std :: lengthは奇妙に聞こえます-私はそれを聞いたことがありません)

私の知る限り、FLS APIが利用できない場合、FlsGetValueは自動的にTLSの対応物にフォールバックします。

それでも問題が解決しない場合は、クラッシュ時にプロセスの.dmpを取得して投稿します(多数の無料アップロードサービスのいずれかを使用し、リンクを提供してください)(SOに不足している機能のように聞こえます-ソース/データファイル両替?)

于 2008-12-22T12:36:54.830 に答える
0

main() の前のクラッシュは、通常、グローバル変数または静的変数の不適切なコンストラクターが原因で発生します。

クラス Randomのコンストラクターのように見えます。

于 2008-12-02T02:36:40.237 に答える
0

Random 型のグローバル変数または静的変数がありますか? それが入っているライブラリが適切に初期化される前に、それを構築しようとしている可能性はありますか?

グローバル変数と静的変数の構築順序は固定されておらず、デバッグからリリースに至るまで変更される可能性があることに注意してください。

于 2008-12-02T04:05:45.783 に答える