0x00000000处的分段错误错误

时间:2013-11-13 00:29:50

标签: c++

让我先从错误开始。运行GDB时我一直遇到这个seg错误:

#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,所以不是它。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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