在C ++中删除全局分配的内存

时间:2013-05-10 00:39:55

标签: c++

今天我尝试创建全局指针:

int *map = new int[M2*N2];

然后我试图在main()函数中删除它:

delete[] map;
map = NULL;

但在执行完所有程序后,它会出错:

free(): invalid next size (fast)

那么,是否有可能创建这样的指针然后在其他地方删除它?

修改

固定。

M2是M + 1(M是阵列的极限),使用M2 = M + 10后,它可以工作。

感谢所有......

1 个答案:

答案 0 :(得分:7)

错误似乎在说,当它试图清理你的内存块时,为下一个堆块存储的大小是无效的。此信息通常存储在小标题块中,就在您从new获得的指针之前。

...--+----------------+--------+----------+------------+------------+--...
     | previous block | block  | block    | next block | next block |
     | data           | header | data     | header     | data       |
...--+----------------+--------+----------+------------+------------+--...
                                ^          ^
                                |          |
new[] returns pointer here -----+          |
You probably wrote into here --------------+
meaning the OS can no longer find blocks after there.

我敢打赌你写的是在数组范围之外的内存。换句话说,您正在访问小于0或大于或等于M2*N2的索引。 (因为它抱怨下一个堆块头被破坏,所以可能是后一种情况。)

关闭部分代码,直到free()停止投诉为止。然后打开关闭的部件,直到它再次启动。将其缩小到导致问题的几行或一行,然后修复它。

编辑现在您已确定更大的阵列解决问题 - 它无法修复 - 您应该将数组的“越界”部分初始化为某个已知的常量(选择一个数字,最好是数据中的数字),然后在程序结束时,您可以看到哪些是超出范围的元素改变。

最后,如果您的代码不能与int *map = new int[M*N];一起使用,那么它就是错误的代码。如果我的一个下属告诉我M2=M+10是代码的最终解决方案,我会解雇他们。这只不过是一个等待回来咬你的潜在错误,可能是在最后期限到来时。