在 C 中释放分配的内存

Free allocated memory in C

假设我已经分配了一个足够大的 char** 数组。

为什么我可以 free(arr) 而不能 free(arr + 5)

请注意,我说的不是 arr[0]arr[5]

您总是使用 malloc()realloc()calloc() 返回的指针调用 free()。您不得传递任何其他指针。

来自 free() 手册:

The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc(), or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior occurs. If ptr is NULL, no operation is performed.

malloc(3) 这样不行。它在内存中分配一个固定大小的数据块,在块的开头添加元数据(例如下一个空闲块的地址或块的大小)和 returns 紧跟在元数据之后的地址。

free(3) 需要执行元数据中包含的信息(例如,更新其链表中空闲块的地址。如果您提供的指针尚未被 malloc(3),元数据不存在,free 无法做到这一点。

出于这个原因,free(3) 的手册页明确禁止传递尚未由 `malloc(3)

分配的指针

The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc(), or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior occurs. If ptr is NULL, no operation is performed.

这样做可能会导致未定义的行为,如果您的系统没有采取一些保护措施来防止您这样做,可能会导致安全漏洞,因为free(3) 写入 到伪元数据指向的任意内存区域。