名前空間
変種
操作

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() または realloc() がすでに呼ばれ、その後 ptr と等しいポインタを返した malloc()calloc()aligned_alloc() (C11以上) または realloc() の呼び出しがない場合、動作は未定義です。

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);
}


[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.22.3.3 The free function (p: 348)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.20.3.2 The free function (p: 313)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.10.3.2 The free function

[編集] 関連項目