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 所指代的内存区域已经被解分配,则行为未定义,即是说已经以 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 The free function (第 365 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.22.3.3 The free function (第 254 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.22.3.3 The free function (第 348 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.20.3.2 The free function (第 313 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.10.3.2 The free function

参阅

分配内存
(函数)
归还之前分配的指定大小的内存
(函数)
归还之前分配的指定大小和对齐的内存
(函数)