0

在启动时,我的应用程序将在大约 %50 的时间内崩溃,并在以下代码行出现分段错误:

float** temp = new float*[map_size];

map_size 的值为 513。

在调试模式下永远不会出现这种糟糕的情况。该应用程序现在相当大,有 10,000 行代码,并且有多个线程在运行,所以我怀疑发布任何其他代码是否有用。(我不确定要发布什么)

由于这行代码相当简单,我猜我的错误在其他地方。我最好的猜测是我的程序在其他地方超出了分配的内存,然后当我偶尔尝试分配更多内存时,它会发生冲突并导致错误。这是可能的情况吗?

什么样的行为会导致内存分配出现分段错误?以及如何缩小代码中发生这种情况的范围?

4

1 回答 1

4

调用内存分配函数的崩溃几乎总是由于堆损坏。

想想内存分配函数是如何工作的。它首先检查以前释放的块列表,看看是否有一个合适的大小,如果没有找到,它会从操作系统请求一个新块。

如果其他代码通过写入超出其他动态分配对象的边界而破坏了堆的内部指针,那么当使用的内存分配函数::operator new尝试遍历堆时,它将使用野指针并崩溃。

崩溃发生在这里,但内存损坏发生得更早,并且实际上可能是在您的程序中使用动态分配的对象的任何地方。它甚至不必是分配或解除分配发生的地方。

检查您的编译器是否提供“malloc 调试”,它会向围绕动态分配的堆元数据添加额外的金丝雀字段,以检测超出范围的写入。像Electric Fence(免费!)之类的东西也可以提供帮助,方法是安排一个无法访问的内存页面来将元数据与每个对象分开,这样 MMU 就会捕获边界错误。或者类似于 Rational Purify 的运行时边界检查器(真的非常昂贵)。

于 2013-03-21T21:19:23.897 回答