21.4 メモリの開放

前にメモリの割り当てを malloc()で行うことを学びましたが、 必要がないメモリを何時までも放っておいては使えるメモリが少なく なっていきます。ですから、必要がなくなった時点で使ったメモリを システムに返却する必要があります。これを行う関数が free() です。free()は void型ですので、何も結果は返しません。 使い方は次のようにします。

    /* char 20個のメモリの確保と開放 */
    char * s;
    s = (char *)malloc( sizeof(char) * 20 );
    ...
    free(s);
ここで注意しなければならないのは、一度free()してしまった 領域を参照したり、利用したりしてはいけないという点です。 C言語でのプログラミングにおけるバグのほとんどは、この malloc()free()に関連するメモリ管理のバグであると言っても過言では ない位なのです。

また、free()によって開放したからと言って問題が無い訳では ありません。実は、malloc()をしたメモリの内の幾つかを free() によって開放した場合、メモリは虫食いのように所々が空いた状態になります。 もし、全てのメモリがこのような虫食い状態になってしまうと、大きなメモリ を確保したくても、そのようなブロックが存在しないような場合が生じます。 こうした状態をメモリのスライシングと呼んでいますが、これを 解消するためにはガーベッジコレクションと呼ばれるメモリの掃除が必要と なりますが、残念ながらC言語自体にはそうしたメカニズムは存在していません。 従って、そのような事態が想定される場合にはガーベッジコレクションを サポートした高度なライブラリを別途用意しなければなりません。



最初のページ 戻る 次へ 最後のページ 目次
Hiroyasu Asami