free(3)

#include <stdlib.h>

void free(void *ptr);

free(3)で注意すべきは、

  1. 引数ptrの値は、malloc、calloc、またはreallocの返却値と同じでなければならない。
  1. すでに解放された領域に対してfree(3)すること(二重解放)は動作未定義である。
  1. NULLポインタに対するfree(3)は何もしない。この特性を利用して、動的確保した領域を指すポインタ変数には、解放のタイミングでNULLを代入するのが定石である。NULLでない場合にのみfree(3)する、という考慮は杞憂である。
  1. 解放後の領域は、未使用リストに追加され、確保したプログラム内で再利用されるが、解放された領域がOSに返されるわけではない。また、それらの管理情報は、データセグメント(のmalloc(3)が内部で利用するメモリ空間)に配置されるが、ユーザーデータが破壊されると、これらの管理情報も破壊される恐れがある。管理領域が破壊された状態でfree(3)を呼び出すと、セグメンテーションフォールトが発生する。
  1. 動的確保した領域を、構造体型(メンバ変数に動的確保した領域を指すポインタ変数を持つ)へのポインタ変数で管理する場合、そのポインタ変数に対してfree(3)しても、そのメンバ変数が指す領域は自動的に解放されない。そのような領域を解放する専用の関数を自作すべきである。