0

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

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

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

delete[] map;
map = NULL;

但是在执行完所有程序后,它给出了错误:

free(): invalid next size (fast)

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

编辑

其固定。

M2 是 M+1(M 是数组的限制),使用 M2=M+10 后它起作用了。

谢谢大家...

4

1 回答 1

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这是对代码的最终修复,我会解雇他们。这只不过是一个等待回来咬你的潜在错误,可能就在最后期限到来时。

于 2013-05-10T01:11:46.660 回答