1

それでは、エラーから始めましょう。GDB を実行しているときに、このセグ フォールトが発生し続けます。

#0  0x00000000 in ?? ()
#1  0x0804aacc in find_closest_object (list=0x8052928, base=0xbffff148, 
dir=0xbffff130, last_hit=0x0, retdist=0xbffff0f0) at raytrace.c:34
#2  0x0804ab96 in ray_trace (model=0x80528f0, base=0xbffff148, dir=0xbffff130, 
pix=0xbffff160, total_dist=0, last_hit=0x0) at raytrace.c:80
#3  0x0804a99a in make_pixel (model=0x80528f0, x=0, y=0) at image.c:29
#4  0x0804aa09 in make_row (model=0x80528f0, y=0) at image.c:47
#5  0x0804aa53 in image_create (model=0x80528f0, out=0x8052788) at image.c:69
#6  0x08048aed in main (argc=3, argv=0xbffff2b4) at main.c:30

したがって、基本的に、?? で 0x00000000 のこの不明なエラーが発生し続けます。それは一体何を意味するのでしょうか?raytrace の 34 行目に次のように書かれています。

  dist = obj->hits(base, dir);

問題が何であるかについての手がかりはありますか?必要に応じてさらに投稿できますが、何が必要なのか正確にはわかりません。助けてくれてありがとう!

編集: last_hit は NULL であるはずなので、そうではありません。

4

2 に答える 2

2

まだ初期化されていない仮想関数を呼び出している可能性があります。C++ がオブジェクトを作成するとき、仮想テーブルをクリアしてから、必要に応じてテーブルの一部をコピーする傾向があります。すべてのコンストラクターが実行される前に関数を呼び出すと、それらのポインターの一部が NULL になり、それらを呼び出そうとすると、説明したとおりになります。

ただし、obj->hits() が仮想関数でない場合、それが何を行ってもスタックが破壊され、RTS 命令 (または同等の命令) が実行された時点で戻り IP アドレスは NULL になります。その時点で、プロセッサはその NULL アドレスでコードを実行しようとします。これは、バッファがスタック上に作成されるときのバッファ オーバーランと呼ばれます。

これが、このようなエラーが発生する 2 つの主な理由です。MS-Windows では、同じメモリ バッファを複数回解放しようとした後にも、これらが発生するのを見てきました。しかし、それが NULL になる可能性は低いです。

于 2013-11-13T00:43:01.637 に答える