我使用的是可变大小的C结构,如下所示:
typedef struct {
int num_elems;
int elem1;
} mystruct;
// say I have 5 elements I would like to hold.
mystruct * ms = malloc(sizeof(mystruct) + (5-1) * sizeof(int));
ms->num_elems = 5;
// ... assign 5 elems and use struct
free(ms);
这最后一次free()会释放malloc所有的东西,还是只有sizeof(mystruct)?
答案 0 :(得分:4)
是。这将释放使用malloc
分配的整个块。
如果使用malloc
分配单个内存块(就像您在示例中所做的那样),那么您需要调用free
一次以释放整个块。
答案 1 :(得分:2)
在执行此类操作时要注意的一件事是,free /用于确定要释放的内存的分配记录是由malloc创建的,并与地址malloc返回相关联。
这意味着您可以在指向malloc块的第一个字节的任何指针上调用free,它将释放正确的内存块,但是如果您在块中的任何地址上调用free而不是第一个字节,你最多只能使用SIGSEV或SIGBUS,最坏的情况是破坏分配表,导致奇怪和无法解释的行为。
因此,如果你有像这样的块分配mystruct,小心不要将它们与单个分配的mystruct混合,否则你会发现自己面临泄漏内存和破坏内存之间的讨厌选择。