📅  最后修改于: 2023-12-03 14:41:19.982000             🧑  作者: Mango
free()
如何知道要释放的内存大小?在 C 语言中,我们使用 malloc()
和 calloc()
申请内存,使用 free()
释放内存。free()
释放的是一块在堆区中申请的动态内存,但如何知道要释放的内存大小呢?
实际上,在申请动态内存时,系统会为这块内存额外记录一个长度信息,这个长度信息也称作「管理信息」,用来记录这块内存的大小。free()
最后会利用这个信息将这块内存释放掉。这个信息是存在于申请的内存的前面几个字节,因此我们经常可以看到对申请到的内存进行偏移的操作,偏移量正是这个长度信息的长度。
具体而言,调用 malloc()
或 calloc()
时,系统将会向操作系统请求一块连续的虚拟内存空间,这个空间中包含用户可用的内存区域和管理信息区域。在管理信息区域中,存储了指向这块内存区域的指针、内存大小以及一些其他的辅助信息。这样当调用 free()
的时候,它会使用这个指针来寻找这个管理信息,然后使用其中的大小信息将这块内存释放掉。因此在编写程序时,一定要保证对相应内存的释放和申请操作成对出现,否则就会发生内存泄漏或者非法访问的情况。
总之,free()
能够知道要释放的内存大小,是因为在这块内存区域的头部有存储了长度信息的管理信息区域。理解这一点有助于我们更好的理解内存申请和释放的过程。
以下是申请内存、释放内存并验证内存大小的示例代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p = (int *) malloc(sizeof(int) * 10);
if (!p) {
printf("Allocation failed\n");
exit(1);
}
printf("Allocated memory size: %lu\n", sizeof(int) * 10);
free(p);
printf("Memory has been freed.\n");
return 0;
}
预期输出:
Allocated memory size: 40
Memory has been freed.