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,原内存不变 |
👉 这是最危险、最容易写错的地方

浙公网安备 33010602011771号