C/400

24. メモリーの割り振りと解放

「21.ポインターとは?」でC/400ではポインターを定義する理由のひとつに動的なメモリの
割り振りを行うことがあると解説した。
予め長さを特定できない変数をポインターとして定義しておいて必要な時点で長さを指定して
変数を具体的なものとして割り振り、使用後に解放するというものである。
メモリーはしかし割り振りしたものの、途中で長さが不足して再割り振りが必要となる場合が
ある。ここではそのようなケースも含めてもう少し詳しく解説を加える。

最初に単純なメモリの割り振りは

char* buff;
int   len;
len = 256;
buff = (char*)malloc(len);   /* メモリを割り振る */
memset(buff, 0, sizeof(buff));
   :
free(buff); /*メモリを解放 */

のような処理となる。

例では256バイトのメモリを割り振っているだけであるが割り振り可能な最大サイズは
ヒープ・サイズと呼ばれるサイズである。
次に更に + 80 バイト のサイズに拡大したいものとすると

len += 80;
buff = (char*)realloc(buff, len);

のようにして再割り振りすることが可能である。
再割り振りでは既に格納されていたメモリの内容はそのまま残されて拡張される。
また使用した最後には必ず

free(buff);

のようにしてメモリを解放しておかねばならない。

Java ではポインタを使用しないのでメモリの解放忘れによるメモリ・リークは発生しないことが
利点であるとされているが、少しC言語をやればメモリの解放を忘れるようなプログラマーは
ほとんどいない。
「メモリ・リーク」を起こすトラブルよりはメモリを動的に与えることができない不便のほうが
はるかに大きいのである。