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 这个未知错误。这到底是什么意思?在光线跟踪的第 34 行,它说:

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

有什么线索可能是什么问题?如有必要,我可以发布更多信息,但不确定到底需要什么。谢谢您的帮助!

编辑: last_hit 应该是 NULL 所以不是这样。

4

2 回答 2

2

您可能正在调用尚未初始化的虚函数。当 C++ 创建一个对象时,它倾向于清除虚拟表,然后根据需要复制表的各个部分。如果您在所有构造函数运行之前调用一个函数,那么其中一些指针将为 NULL 并且尝试调用它们将按照您的描述进行。

但是,如果 obj->hits() 不是虚函数,那么无论它做什么都会破坏堆栈,并且在 RTS 指令(或等效指令)运行时返回 IP 地址为 NULL。此时,处理器尝试在该 NULL 地址处执行代码。当在堆栈上创建缓冲区时,这称为缓冲区溢出。

这是您收到此类错误的两个主要原因。在 MS-Windows 下,我看到这些也发生在您尝试多次释放相同的内存缓冲区之后。但这不太可能最终为 NULL。

于 2013-11-13T00:43:01.637 回答
0

您无法访问具有未确定值的值。除非您运行构造函数,否则您的对象将具有未确定的值,将无法读取但可以写入。因此,您可以更改其值,但不能读取它。

它可能会给您访问冲突错误。

于 2014-02-27T07:49:19.563 回答