在 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)
将 写入 到伪元数据指向的任意内存区域。
假设我已经分配了一个足够大的 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 byptr
, which must have been returned by a previous call tomalloc()
,calloc()
, orrealloc()
. Otherwise, or iffree(ptr)
has already been called before, undefined behavior occurs. Ifptr
isNULL
, no operation is performed.
这样做可能会导致未定义的行为,如果您的系统没有采取一些保护措施来防止您这样做,可能会导致安全漏洞,因为free(3)
将 写入 到伪元数据指向的任意内存区域。