C/C++

【C言語】【メモリ操作】malloc関数を使ってメモリ領域を確保する/free関数を使って確保したメモリ領域を解放する。

この関数はメモリリークの可能性が高いため、 C言語の中で使いたくない関数のひとつ。
メモリリークは発生したことに気づきにくく、発生しても発生源を見つけることが困難なため。

メモリリーク発生例

p = malloc(n);     /* メモリ領域を確保する */
 :                 /* メモリを使用する     */
free(p);           /* メモリ領域を解放する */

通常ならこのようなコードを書いてしまう。
ここに落とし穴がある。
free()関数に失敗したらどうなるか?

・メモリ領域は解放されない。
・メモリ領域のポインタpは無くなっているので二度とアクセスできない。
 → 結果、メモリリークが発生する。

では、どうすれば良いのか?

free()関数を使う際に一工夫する。

p  = malloc(n);              /* メモリ領域を確保する */
  :                          /* メモリ領域を使用する */
p2 = p;                      /* アドレスをコピーする */
if ( free(n) == NULL ){      /* メモリ領域を解放する */
    /* Error */              /* 領域の解放の失敗時 */
}
else {
    /* Normal */
}

こんな感じだろうか。エラー処理で、一連のfree処理が失敗していることを上位(呼び出し元)に返すことで、リトライさせるなり、失敗メッセージを出すなりすれば、少なくともメモリリークが発生している箇所だけは、明確になるはず。

ホント、メモリリーク探すの大変なんですよ。

コメントを残す

*