在启动时,我的应用程序将在以下代码行中出现大约50%的分段错误时崩溃:
float** temp = new float*[map_size];
map_size的值是513。
在调试模式下,这种情况永远不会发生。应用程序相当大,现在有10,000行代码,并且运行了多个线程,所以我怀疑发布任何其他代码都是有用的。 (我不确定要发布什么)
由于这行代码非常简单,我猜测我的错误在其他地方。我最好的猜测是,其他地方我的程序超出分配的内存,然后当我尝试分配更多偶尔它冲突并导致错误。这是一种可能的情况吗?
什么样的行为可能会导致内存分配出现分段错误?我怎样才能缩小我的代码中发生的位置?
答案 0 :(得分:4)
崩溃调用内存分配函数几乎总是由于堆的损坏。
考虑一下内存分配功能的工作原理。它首先检查先前释放的块的列表,以查看是否有适当大小的块,如果没有找到,则从操作系统请求新块。
如果其他一些代码通过写入超出其他动态分配对象的边界来破坏堆的内部指针,那么当::operator new
使用的内存分配函数试图遍历堆时,它将使用一个狂野的指针并崩溃。
此处发生崩溃,但内存损坏发生得更早,并且可能在程序中任何地方与动态分配的对象一起使用。它甚至不必是分配或解除分配的地方。
检查您的编译器是否提供“malloc调试”,它会为动态分配周围的堆元数据添加额外的canary字段,以便检测超出边界的写入。像Electric Fence(免费!)这样的东西也可以帮助,通过安排一个无法访问的内存页面来分离每个对象的元数据,这样MMU就会捕获边界错误。或者运行时绑定检查器沿着Rational Purify的行(非常非常昂贵)。