このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

目次

freeのプロトタイプ

void free(void *mem);

freeの引数

  • 解放する領域の先頭位置を示すポインタまたはNULLを指定する。

freeの戻り値

freeの特徴

  • freeにNULLを与えると何もしないことが、ANSIで定められている。
  • freeすることで、ヒープが拡張するのを食い止める働きがある。
    • malloc内部ではfreeされて未使用になった領域があれば、その領域を返す。つまりメモリのリサイクルを行うわけである。free直後は空きメモリになるが、OSには返されずしばらくそのままヒープ上に残っている。

freeによるメモリ領域破壊

 まだ必要なメモリ領域を間違えてfreeしてしまうと、予想も付かない場所で領域破壊が起こってしまう。もしfreeしたことを忘れてしまい、ポインタ変数を介してメモリ領域にデータを書き込んでしまうと、予想も付かない別の場所にデータを書き込んでしまう。

メモリリーク

  • mallocしたメモリ領域をfreeすることなく放置すると、プログラムのどこからも参照できなくなるデータが存在することになる。このような状況をメモリリークと呼ぶ。
  • メモリリークはポインタのハンドリングを誤ると簡単に発生する。
  • Javaではガベージコレクション機能があるので、freeしなくてもよい。
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 
 
 
-
|
|
|
|
|
|
|
!
#include <string.h>
#include <stdlib.h>
 
int main(void){
    char *p;
    p = malloc(10);
    strcpy(p, "ABCDEFG");    /* ヌル文字を含む8文字が格納される */
    p = malloc(20);
    strcpy(p, "1234567890");
    free(p);
    return 0;
}

 最初にmallocしたメモリ領域がfreeされていない。後でfreeしたくても、2回目のmallocで獲得したメモリ領域のアドレスを代入しているので、もう無理な状態になってしまっている。つまり、文字列ABCDEFGを格納したメモリ領域は、どこからも参照できない状態になっている。よって、プログラムが終了するまで、使われることがない無駄なメモリ領域として残ってしまうのである。

参考文献

  • 『C言語ポインタが理解できない理由』