glibcのrealloc実装、こうなってたのね

reallocglibcというオープンソースのライブラリ内部に実装された関数なので、そのソースコードがインターネット上に公開されています。

オリジナルはこちらですが、扱いやすいようにgithubにforkした人がいるようなので、有り難くgithubの方を参考にさせてもらいましょう。

関数ヘッダ(関数の仕様の概略をコメントで記述したもの)には以下の記述があります。

If space is not available, realloc returns null, errno is set (if on
ANSI) and p is NOT freed.

if n is for fewer bytes than already held by p, the newly unused
space is lopped off and freed if possible. Unless the #define
REALLOC_ZERO_BYTES_FREES is set, realloc with a size argument of
zero (re)allocates a minimum-sized chunk.

p is NOT freedfreed if possible の辺りに着目しながら、libcrealloc関数本体のコード__libc_realloc (void *oldmem, size_t bytes)を読んでみましょう。この関数の実装を一字一句理解する必要はなく、今回知りたいことの要点だけ調べれば良いです。

関数ヘッダにも書いてあることですが、以下のように面白いことがわかります。

ということで、こちら(cppreference.com)の Example に記載されているコードのように、reallocがエラーとなった場合は、前回のバッファポインタを取っておいて、ちゃんとfreeしてあげないといけないようです。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする