2

多くのレイ/オブジェクトの交差を計算する必要があるコードを C++ で書いていますが、理解できない非常に奇妙なバグが発生しています。

いくつかの非常に大きなインスタンス (たくさんの三角形と光線) で、私のプログラムはセグメンテーション違反を起こします。私はこれらのセグメンテーション違反の原因を突き止めようとしましたが、困惑しました。コードを調べたところ、配列の末尾からインデックスを作成したり、null ポインターにアクセスしたりする必要はないようです。また、コンピューターのメモリが不足しているようには見えません。監視すると、まだ数百メガバイトの空き容量があるようです。

デバッグ中に、次のことを試みました。セグメンテーション違反の原因となった正確な交差計算を特定するために、コードに 2 つの print ステートメントを挿入しました。残念ながら、印刷ステートメントを挿入してプログラムを再度実行すると、すべてが機能しました。セグメンテーション違反ではありませんでした。したがって、これら 2 つの print ステートメントを削除してプログラムを実行すると、セグメンテーション フォールトが発生し、そのままにしておくと正常に動作します (ただし、すべてを印刷する必要があるため、はるかに遅くなります)。これらの印刷ステートメントの削除/追加を除いて、他のすべてはまったく同じに保たれます。

何が原因でこれが起こる可能性がありますか? C++プログラムにprintステートメントを追加すると、セグメンテーション違反が発生しない可能性がありますか?

それがまったく役立つ場合、アルゴリズムは単一のスレッドにすぎず、Linux で g++ を使用してすべてをコンパイルしました。

4

2 に答える 2

4

何が原因でこれが起こる可能性がありますか? c++ プログラムに print ステートメントを追加すると、segfault が発生しない可能性があります。

未定義の動作へようこそ。

配列/ポインタ/etc を自己チェック バージョンに置き換えて、推測するのではなく、これらの領域にバグがないことを証明する必要があります。

于 2012-05-04T23:51:43.560 に答える
3

print ステートメントを挿入するとセグ フォールトが「修正」されるという事実は、アクセスすべきではないメモリにアクセスしていることを明確に示しています。

最善の方法は、print ステートメントを取り出して、プログラムをデバッガーで実行することです。Linux で作業しているので、プログラムを -g フラグでコンパイルし、gdb で実行します。セグメンテーション違反が発生した行を正確に教えてくれるかもしれません。

于 2012-05-04T23:48:45.923 に答える