今天我尝试创建全局指针:
int *map = new int[M2*N2];
然后我试图在main()函数中删除它:
delete[] map;
map = NULL;
但在执行完所有程序后,它会出错:
free(): invalid next size (fast)
那么,是否有可能创建这样的指针然后在其他地方删除它?
修改
固定。
M2是M + 1(M是阵列的极限),使用M2 = M + 10后,它可以工作。
感谢所有......
答案 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
是代码的最终解决方案,我会解雇他们。这只不过是一个等待回来咬你的潜在错误,可能是在最后期限到来时。