image-20240420163459407

malloc和free

1. malloc和free的概念

malloc和free是C语言中用于动态内存分配和释放的函数。malloc函数用于分配一块指定大小的内存空间,返回指向该内存空间的指针;free函数用于释放之前分配的内存空间,将该内存空间标记为可用。

2. malloc和free的使用

#include <stdlib.h>

int main() {
// 分配一块大小为10个int的内存空间
int *p = (int *)malloc(10 * sizeof(int));
if (p == NULL) {
// 内存分配失败
return -1;
}

// 使用分配的内存空间
for (int i = 0; i < 10; i++) {
p[i] = i;
}

// 释放内存空间
free(p);

return 0;
}

3. malloc和free的原理

malloc和free的实现原理是通过操作系统提供的系统调用来分配和释放内存。当调用malloc函数时,操作系统会在堆区中找到一块合适大小的空闲内存块,并返回其起始地址;当调用free函数时,操作系统会将该内存块标记为可用,以便后续的malloc调用可以再次使用。

malloc 会额外分配一些内存用于存储分配的内存块的大小等信息,以便在调用 free 函数时能够正确释放内存。
PREFIX_SIZE 是用于存储额外信息的大小,通常是一个指针大小的倍数,以保证内存对齐。

#define PREFIX_SIZE (sizeof(size_t))

3.1 redis 中 malloc 和 free 的实现

redis 中的内存分配和释放是通过自定义的内存分配器实现的,主要包括以下几个函数:

  • zmalloc:分配内存
  • zfree:释放内存
  • zrealloc:重新分配内存
  • zcalloc:分配并初始化内存
  • zmalloc_usable:获取可用内存大小
  • zmalloc_size:获取内存大小
  • zmalloc_get_rss:获取内存占用