📜  free()如何知道要释放的内存大小?(1)

📅  最后修改于: 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.