c++ - 0x00000000 处的段错误

标签 c++

那么让我从错误开始。运行 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,所以不是。

最佳答案

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

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

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

关于c++ - 0x00000000 处的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19942891/

相关文章:

c++ - 为什么 C++ 链接几乎不使用 CPU?

C++17,为什么自动非类型模板参数不能与 SFINAE 一起使用

c++ - 不调用放置释放函数

C++编译器不识别头文件

c++ - 枚举值 (int) 到类型的动态映射

c++ - 字符串导致内存泄漏?

c++ - 如何在 DirectX 上加载纹理?

c++ - 防止 Content-Disposition 中的绝对文件路径 "filename"

c++ - 当我洗牌时,指向 vector 中元素的指针会发生什么?

c++ - C++中getline的段错误