在C语言中释放零长度数组的分配内存
今天我学习了一个新技巧,包括用一个零长度数组结束一个结构,以便根据需要动态调整该数组的大小。这非常方便,当我想确定我的结构在运行时而不是编译时消耗的空间量时,它有助于节省大量内存 使用它们非常有效;然后我想起我需要释放分配的内存,所以我扔下了一个free(struct);但令我沮丧的是,这让我犯了一个错误:在C语言中释放零长度数组的分配内存,c,arrays,memory-management,struct,free,C,Arrays,Memory Management,Struct,Free,今天我学习了一个新技巧,包括用一个零长度数组结束一个结构,以便根据需要动态调整该数组的大小。这非常方便,当我想确定我的结构在运行时而不是编译时消耗的空间量时,它有助于节省大量内存 使用它们非常有效;然后我想起我需要释放分配的内存,所以我扔下了一个free(struct);但令我沮丧的是,这让我犯了一个错误: *** glibc detected *** ./program: free(): invalid next size (fast): <address> ===
*** glibc detected *** ./program: free(): invalid next size (fast): <address>
======= Backtrace: =========
<omitted>
======= Memory Map: ========
<omitted>
我免费得到错误(ptr)
有什么想法吗?你的malloc()
/free()
代码很好。要进行验证,请注释掉malloc()
和free()
之间的所有内容,然后查看问题是否消失(我打赌它会消失)
您几乎肯定会在某个地方(可能在
doStuff()
中)写入超过分配内存末尾的内容。例如,如果doStuff()
使用ptr->size
确定ptr->data
的大小,请确保ptr->size
已正确初始化。可能无论您在doStuff()
中执行什么操作,都使用了超出结构头之外的30个额外字节。确保您正确计算了所需的空间量。删除doStuff(),然后重试。您是否有相同的错误?可能您的代码在某个地方更改了ptr的值
使用:
struct Stuff * const ptr = ...
而不是:
struct Stuff * ptr = ...
在编译时检测此类问题。您在doStuff方法中使用ptr做什么(问题可能就在那里)?您可能正在运行数据的末尾,并损坏堆中的某些内容-在调用free()
之前,问题不会出现,但是free()
本身不是问题所在。还要注意的是,不应强制转换malloc
的返回,长度为零的字段是非标准字段,因此不可移植。后者的标准方法是省略终止数组字段的大小。这两个看起来都可能是问题。我尝试在malloc之后释放,我的代码的其余部分工作得很好,就像从来没有释放过一样。我想我需要做大量的猎虫工作。我在问题结构上抛出了几个memset(),它似乎解决了问题。谢谢你的提示!“似乎解决了问题”->translation->“暂时屏蔽了我代码中的bug,这样它们很可能会在以后再来咬我”。不,你只是假设而已。这个问题与字符串没有正确地以null结尾有关,这就是为什么它在结尾处运行。Memset解决了这个问题。
struct Stuff * ptr = ...