名前空間
変種
操作

free

From cppreference.com
ヘッダー <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 The free function (p: 365)
  • C17標準 (ISO/IEC 9899:2018)
  • 7.22.3.3 The free function (p: 254)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.22.3.3 The free function (p: 348)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.20.3.2 The free function (p: 313)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 4.10.3.2 The free function

[編集] 関連項目

メモリを割り当てる
(関数) [編集]
以前に割り当てられたサイズのメモリを解放する
(関数) [編集]
以前に割り当てられたサイズとアライメントのメモリを解放する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)