命名空间
变体
操作

free

来自 cppreference.com
< c‎ | memory
定义在头文件 <stdlib.h>
void free( void *ptr );

释放之前由 malloc()calloc(), aligned_alloc(),(自 C11)realloc() 分配的空间。

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

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

如果 ptr 所指的内存区域已经被释放,即 free(), free_sized(), free_aligned_sized()(自 C23)realloc() 已经使用 ptr 作为参数被调用,并且之后没有调用 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); // every allocated pointer must be freed
 
    int *p2 = calloc(10, sizeof *p2);
    int *p3 = realloc(p2, 1000*sizeof *p3);
    if(p3) // p3 not null means p2 was freed by realloc
       free(p3);
    else // p3 null means p2 was not freed
       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 函数 (p: 313)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 4.10.3.2 free 函数

[编辑] 另请参见

分配内存
(函数) [编辑]
释放之前分配的已分配大小的内存
(函数) [编辑]
释放之前分配的已分配大小和对齐的内存
(函数) [编辑]
C++ 文档 for free