この関数はメモリリークの可能性が高いため、 C言語の中で使いたくない関数のひとつ。
メモリリークは発生したことに気づきにくく、発生しても発生源を見つけることが困難なため。
メモリリーク発生例
p = malloc(n); /* メモリ領域を確保する */
: /* メモリを使用する */
free(p); /* メモリ領域を解放する */
通常ならこのようなコードを書いてしまう。
ここに落とし穴がある。
free()関数に失敗したらどうなるか?
・メモリ領域は解放されない。
・メモリ領域のポインタpは無くなっているので二度とアクセスできない。
→ 結果、メモリリークが発生する。
では、どうすれば良いのか?
free()関数を使う際に一工夫する。
p = malloc(n); /* メモリ領域を確保する */
: /* メモリ領域を使用する */
p2 = p; /* アドレスをコピーする */
if ( free(n) == NULL ){ /* メモリ領域を解放する */
/* Error */ /* 領域の解放の失敗時 */
}
else {
/* Normal */
}
こんな感じだろうか。エラー処理で、一連のfree処理が失敗していることを上位(呼び出し元)に返すことで、リトライさせるなり、失敗メッセージを出すなりすれば、少なくともメモリリークが発生している箇所だけは、明確になるはず。
ホント、メモリリーク探すの大変なんですよ。