Namespaces
Variants

free

From cppreference.net
定义于头文件 <stdlib.h>
void free ( void * ptr ) ;

释放先前由 malloc() calloc() aligned_alloc() (C11起) realloc() 分配的空间。

如果 ptr 是空指针,该函数不执行任何操作。

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

如果 ptr 所指代的内存区域已被释放(即已使用 ptr 作为参数调用过 free() free_sized() free_aligned_sized() (C23起) realloc() ),且之后没有通过调用 malloc() calloc() realloc() aligned_alloc() (C11起) 获得与 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);
}

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 7.24.3.3 free 函数 (p: 365)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.22.3.3 free 函数 (p: 254)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.22.3.3 free 函数 (p: 348)
  • C99标准(ISO/IEC 9899:1999):
  • 7.20.3.2 free函数(第313页)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.10.3.2 free 函数

参见

分配内存
(函数)
释放先前分配的指定大小内存
(函数)
释放先前分配的指定大小和对齐方式的内存
(函数)
C++ 文档 关于 free