2

我正在用 C++ 编写一些代码,这些代码必须计算大量的光线/对象交叉点,并且我遇到了一个非常奇怪的错误,我不明白。

在一些非常大的实例(很多三角形和射线)上,我的程序会出现段错误。我一直试图找出这些段错误的来源,但我被难住了。我查看了我的代码,似乎我不应该尝试从数组的末尾索引或访问空指针。我的计算机似乎也没有内存不足。当我监控它时,看起来还有几百兆字节的空闲空间。

在调试时,我尝试了以下操作:我在代码中插入了两个打印语句,试图确定导致段错误的确切交叉计算。对我来说不幸的是,当我插入打印语句并再次运行程序时,一切正常。它没有段错误。因此,如果我删除这两个打印语句并运行程序,它会出现段错误,如果我将它们保留在其中,它就可以正常工作(尽管它必须打印所有内容要慢得多)。除了删除/添加这些打印语句之外,其他所有内容都保持完全相同。

什么可能导致这种情况发生?将打印语句添加到 c++ 程序如何可能导致它没有段错误?

如果它有帮助,算法只是一个单线程,我在 Linux 中使用 g++ 编译了所有内容。

4

2 回答 2

4

什么可能导致这种情况发生?将打印语句添加到 c++ 程序如何可能导致它没有段错误?

欢迎来到未定义的行为。

您需要用自检版本替换您的数组/指针/等,并证明,而不是猜测,您在这些区域没有任何错误。

于 2012-05-04T23:51:43.560 回答
3

插入打印语句“修复”段错误这一事实清楚地表明您正在访问不应该访问的内存。

最好的办法是取出打印语句,然后通过调试器运行程序。由于您在 Linux 中工作,因此请使用 -g 标志编译您的程序并通过 gdb 运行它。它可能会准确地告诉您它在哪一行出现段错误。

于 2012-05-04T23:48:45.923 回答