024.实现监控realloc分配内存

realloc 是 C 语言里最容易被“会用但用错”的函数之一

尤其你现在在做 内存监测 / eBPF / 泄漏分析,如果对 realloc 理解不够深,监测模型一定会出 bug


一、一句话工程级定义(先记住)

realloc** 的本质不是“扩容”,
****而是:
**“在保持已有数据前提下,重新分配一块大小为 new_size 的内存,并返回新的指针”。

📌 是否移动内存,是实现细节,不是语义保证。


二、函数原型 & 基本语义

void *realloc(void *ptr, size_t new_size);

语义分解:

参数 含义
ptr 之前由 malloc / calloc / realloc 返回的指针
new_size 新的期望大小
返回值 新内存地址(可能等于 ptr,也可能不同)

三、realloc 的 4 种合法用法形态

这是你写监测工具时一定要分清的


ptr == NULL → 等价于 malloc

p = realloc(NULL, 128);

等价于:

p = malloc(128);

📌 这是标准保证的


new_size == 0 → 等价于 free

realloc(p, 0);

C 标准规定:

  • 行为等价于 free(p)
  • 返回值:
    • 可能是 NULL
    • 也可能是一个“可 free 的非 NULL 指针”(极少)

👉 工程上:当成 free 看


③ 缩小内存(in-place)

p = realloc(p, 64);

可能发生:

  • 不移动内存
  • 原地址继续使用
  • 多出来的部分被 allocator 内部回收

📌 用户永远不能再访问原来超过 64 的部分


④ 扩大内存(可能移动)

p = realloc(p, 1024);

可能发生三种情况:

情况 行为
后面空间足够 原地扩展
不够 分配新块 + memcpy
失败 返回 NULL,原内存不变

👉 这是最危险、最容易写错的地方


posted @ 2026-06-02 00:43  BlackSnow  阅读(9)  评论(0)    收藏  举报