【问题标题】:C dynamic memory problems with malloc() and free()malloc() 和 free() 的 C 动态内存问题
【发布时间】:2016-09-24 22:52:03
【问题描述】:

我动态分配了 2 个不同的数组,每个数组有 100 万个单元格。一个数组保存整数,一个数组保存指向固定长度字符串的指针。当我使用 gdb 运行程序时,出现错误:free(): invalid next size (fast)。我必须以非法方式释放内存,但我不知道如何。我在下面使用 malloc 和 free 的地方发布了我的代码的简短 sn-p。你能告诉我我做错了什么吗?谢谢。

【问题讨论】:

  • 一个数组保存指向固定长度字符串的指针 然后不要使用malloc()。还要经常检查malloc()的返回值和NULL,不要写x -> y,这很可怕,只是x->y很好,因为这种运算符使表达式与其他运算符不同,同样如此对于.
  • 你确定你将正确的指针传递给释放函数,还是你没有做两次?
  • @iharob,对不起,我应该提到我将来可能不会使用 100 万个单元格,它可能会因输入而异。
  • 一般建议大家发MCVE。您的代码是一个很好的例子,如果这样做已经告诉您您发布的代码 有效 表明其他地方存在问题。 ideone.com/xmunl3
  • @TheEyesHaveIt 如果您要使用固定大小的字符串,请考虑使用这样的 typedef:ideone.com/2rwXb2

标签: c memory-management memory-leaks gdb free


【解决方案1】:

除了有点奇怪(见 iharob 的评论),您向我们展示的代码看起来是正确的。

错误很可能不在您向我们展示的代码中。

可能发生的情况是,您在其他地方用字符填充您的那些“单词”,并且您存储了从wc->allWords[i] 地址开始的 20 多个字符。因此,您正在写超过一个内存块的末尾,以及下一个内存块的标题。

然后,稍后,你试图释放的块的地址是正确的,但是你已经损坏了块的头部,所以free()失败了。

【讨论】:

  • 谢谢,我会调查的。另外,“损坏的标头”是什么意思?
  • “损坏”在这种情况下意味着“覆盖”。 C 运行时存储了一些值,您可能在它们上面写了字符。
猜你喜欢
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2016-12-29
  • 2014-09-06
  • 2011-05-09
  • 1970-01-01
  • 2010-10-25
相关资源
最近更新 更多