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