free

< c‎ | memory
定义于头文件 <stdlib.h>
void free( void* ptr );

解分配之前由 malloc()calloc()aligned_alloc() (C11 起)realloc() 分配的空间。

ptr 为空指针,则函数不进行操作。

ptr 的值不等于之前从 malloc()calloc()realloc()aligned_alloc() (C11 起) 返回的值,则行为未定义。

ptr 所指代的内存区域已经被解分配,则行为未定义,即是说已经以ptr 为参数调用 free()realloc() ,而且没有后继的 malloc()calloc()realloc() 调用以 ptr 为结果。

若在 free() 返回后通过指针 ptr 访问内存,则行为未定义(除非另一个分配函数恰好返回等于 ptr 的值)。

free 是线程安全的:它表现得如同只访问通过其参数可见的内存区域,而非任何静态存储。

free 解分配内存区域的调用,同步于任何令分配函数分配相同或部分相同区域的后续调用。这种同步出现于任何解分配函数所做的内存访问后,和任何分配函数所做的内存访问前。所有操作每块特定内存区域的分配及解分配函数拥有单独全序。

(C11 起)

参数

ptr - 指向要解分配的内存的指针

返回值

(无)

注解

此函数接收空指针(并对其不处理)以减少特例的数量。不管分配成功与否,分配函数返回的指针都能传递给 free()

示例

#include <stdlib.h>
 
int main(void)
{
    int *p1 = malloc(10*sizeof *p1);
    free(p1); // 每一个分配的指针都要释放
 
    int *p2 = calloc(10, sizeof *p2);
    int *p3 = realloc(p2, 1000*sizeof *p3);
    if(p3) // p3 非空表示 p2 被 realloc 释放
       free(p3);
    else // p3 为空表示 p2 未被释放
       free(p2);
}


引用

  • C11 standard (ISO/IEC 9899:2011):
  • 7.22.3.3 The free function (p: 348)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.20.3.2 The free function (p: 313)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.10.3.2 The free function

参阅