今天我尝试创建全局指针:
int *map = new int[M2*N2];
然后我试图在 main() 函数中删除它:
delete[] map;
map = NULL;
但是在执行完所有程序后,它给出了错误:
free(): invalid next size (fast)
那么,是否可以创建这样的指针,然后在其他任何地方删除它?
编辑
其固定。
M2 是 M+1(M 是数组的限制),使用 M2=M+10 后它起作用了。
谢谢大家...
今天我尝试创建全局指针:
int *map = new int[M2*N2];
然后我试图在 main() 函数中删除它:
delete[] map;
map = NULL;
但是在执行完所有程序后,它给出了错误:
free(): invalid next size (fast)
那么,是否可以创建这样的指针,然后在其他任何地方删除它?
编辑
其固定。
M2 是 M+1(M 是数组的限制),使用 M2=M+10 后它起作用了。
谢谢大家...
该错误似乎是说,当它试图清理你的内存块时,为下一个堆块存储的大小是无效的。此信息通常存储在小的标题块中,就在您从中获取的指针之前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
这是对代码的最终修复,我会解雇他们。这只不过是一个等待回来咬你的潜在错误,可能就在最后期限到来时。