gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:22:06 24 4
gpt4 key购买 nike

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

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

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

delete[] map;
map = NULL;

但是在执行完所有程序后出现错误:

free(): invalid next size (fast)

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

编辑

它是固定的。

M2 为 M+1(M 为数组的极限),使用 M2=M+10 后有效。

感谢所有...

最佳答案

错误似乎是说,当它试图清理您的内存块时,为下一个堆 block 存储的大小无效。此信息通常存储在小的 header block 中,就在您从 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 的索引。 (因为它提示下一个堆 block 头被损坏,所以它可能是后一种情况。)

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

编辑:既然您已经确定更大的数组可以解决问题——它不能解决问题——您应该将数组的“越界”部分初始化为某个已知常量(选择一个数字,最好是一个不太可能出现在您的数据中的数字),然后在程序结束时,您可以看到哪些元素越界了改变了。

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

关于c++ - 在 C++ 中删除全局分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com