3

我正在使用可变大小的 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)?

4

2 回答 2

4

是的。这将释放使用分配的整个块malloc

malloc如果您使用(就像您在示例中所做的那样)分配单个内存块,那么您需要只调用free一次以释放整个块。

于 2010-07-27T23:41:31.667 回答
2

做这类事情时要注意的一件事是,free 用来确定要释放的内存的分配记录是由 malloc 创建的,并与 malloc 返回的地址相关联。

这意味着您可以在指向 malloc 块的第一个字节的任何指针上调用 free ,它将释放正确的内存块,但是如果您在块中除第一个字节之外的任何地址上调用 free ,你充其量只会是 SIGSEV 或 SIGBUS,最坏的情况是会破坏分配表,从而导致奇怪和莫名其妙的行为。

因此,如果您有这样的块分配 mystruct,请注意不要将它们与单一分配的 mystruct 混合使用,否则您会发现自己面临着在泄漏内存和破坏内存之间的令人讨厌的选择。

于 2010-07-28T01:45:36.013 回答