如果我使用malloc()为自己分配一块内存,将NULL分配给位于该块内但不位于该块末尾的内存地址,然后在该块上调用free(),我会成功释放整个块,还是只释放块中达到NULL的部分?换句话说,free()是否依赖于NULL终止来标识内存块的末尾,或者是否有其他内部方法?
我知道这个问题只适用于为指针分配的内存(当NULL实际上意味着除所有位为零之外的其他东西时)
例如:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char **myBlock = malloc(20 * sizeof(char *));
myBlock[10] = NULL;
free(myBlock);
return 0;
}
这个代码会释放10 * sizeof(char *)
还是20 * sizeof(char *)
?
非常感谢!
函数malloc将使用一个结构来管理它分配给的内存
struct mem_control_block {
int is_available;
int size; //the actually size allocated
};
因此,free函数还将使用mem_control_block中的可变大小来释放内存缓冲区。因此Null不会影响。
free()
不知道它的内容,所以答案是肯定的。free()
将释放通过malloc()
分配的完整内存块
free只使用从malloc返回的指针。该指针只具有内存块的信息,而不具有与该内存上的内容有关的信息。所以免费与NULL无关。
例如,内存分配基于Glibc上独立于内核的实现,操作系统总是在程序存在后收回内存,对指针调用free()将释放整个块,无论你放入什么。
如果你想得到更详细的解释,你可以看看借来的malloc(),谢谢你。
内存分配保留了已分配内存块的引用和长度(仅此而已),如果您释放(),您将返回:
20 * sizeof(char *)
干杯