2016年5月4日水曜日

C99 で realloc の仕様が変わっていた

realloc は動的に割り当てたメモリ領域のサイズを変更したい時に使いますが、地味に C99 で仕様が変わっていたことを今更知りました。
C89 では、realloc に関して以下の規定がありました。

ISO/IEC 9899:1990 7.10.3.4
If size is zero and ptr is not a null pointer, the object it points to is freed.

つまり、realloc(ptr, 0) のようにサイズに0を指定すると free(ptr) と同じになるということですが、C99 ではこの一文が削除されていました。
C99 以降では、realloc(ptr, 0) の呼び出しで、メモリが開放されて NULL が返るのか、NULL 以外のポインタが返されるのか、処理系定義となりました。

C89 でも malloc(0) で NULL が返るか、NULL 以外のポインタが返るかは処理系定義だったので、それに準じる仕様にされたということでしょうか。
実際のところ、realloc を free の代わりに使うようなコードはそう無いとは思いますが、メモリ領域を徐々に小さくしていって最後は開放するというような実装をすることはありえなくは無いかな。

追記:
C++11 でも C99 と同様の仕様に改められています。