Namespaces
Variants

free

From cppreference.net
ヘッダーで定義 <stdlib.h>
void free ( void * ptr ) ;

malloc() calloc() aligned_alloc() (C11以降) または realloc() によって以前に割り当てられた領域を解放します。

ptr がnullポインタの場合、この関数は何も行いません。

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 の呼び出しでメモリ領域を解放すると、その同じ領域全体または一部を割り当てる後続の割り当て関数の呼び出しと synchronizes-with する。この同期は、解放関数によるメモリへのアクセス後かつ割り当て関数によるメモリへのアクセス前に発生する。各特定のメモリ領域を操作するすべての割り当て関数と解放関数には単一の全順序が存在する。

(C11以降)

目次

パラメータ

ptr - 解放するメモリへのポインタ

戻り値

(なし)

注記

この関数は、特殊ケースの量を減らすために(何も行わずに)nullポインタを受け入れます。アロケーションが成功するかどうかにかかわらず、アロケーション関数によって返されたポインタは 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がnullでない場合、p2はreallocによって解放されたことを意味する
       free(p3);
    else // p3がnullの場合、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関数 (p: 313)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.10.3.2 free関数

関連項目

メモリを割り当てる
(関数)
以前に割り当てられたサイズ指定メモリを解放する
(関数)
以前に割り当てられたサイズ指定かつアライメントされたメモリを解放する
(関数)