
だいたい、reallocとfreeだけあれば十分なのにmallocとcalloc用意してるんだから、bzeroも用意しろよ!<またそれか
2016-12-07 11:44:57
@AoiMoe やっぱり間違いかも知れません。sizeに0を指定するとfreeされるけど返り値として有効なアドレスが返ってくることがあるので0サイズの領域を指すポインタが永久にdeallocate出来ないのでは…?
2016-12-07 13:24:11
@yohhoy これ読んで出来ると思い込んでたんですが、ダメですか? | size が 0 で ptr が NULL でない場合には、 free(ptr) と等価である。 linuxjm.osdn.jp/html/LDP_man-p…
2016-12-07 13:25:08
@eldesh en.cppreference.com/w/c/memory/rea… ちゃんと当たってないですが こんな記述もあって微妙かも?
2016-12-07 13:27:29
@yohhoy なるほど。やはりdeallocateだけを行う手段は無さそうに見えますね。 私の見解> twitter.com/eldesh/status/…
2016-12-07 13:34:41
realloc の 0 は、今の Linux は free と等価、今の UNIN の規定では処理系定義、C 言語では規定無し、かな?
2016-12-07 13:37:47
@AoiMoe ハイ。ただC言語の現在のドラフトで確認したところ §7.22.3.5 realloc function deallocates the old object とは書いてあるのでそこは確実だとは思います。(返って来るモノがあやしい
2016-12-07 13:44:02
@eldesh ああなるほど、解放はされるけど何が返ってくるかは実装依存だから無視せよってことですね。既に無効な第一引数がそのまま来るかもしれないし、あるいは内部で使われたeaxレジスタのゴミが返ってくるかもしれないとか。
2016-12-07 13:55:09
@AoiMoe いえ。戻ってくるのはNULL、またはfree出来る有効なポインタ(ただしサイズ0なのでデリファレンス出来ない)です。どっちが来るかは実装依存だと思います。後者が来る場合はそれもfreeしたいんですけど、そこでreallocを使うとまた別のポインタが…。
2016-12-07 14:01:18
@eldesh なるほど。まあ普通に考えて、「常にfreeされる」か「常にfreeされない」かの二択でしょうね。
2016-12-07 14:05:15
NULLが返ってくるのは「新しいオブジェクトがアロケートできなかった場合」であり、その場合には「古いオブジェクトは開放されず、ptrは有効なまま残る」と書いてある。どう考えても実装依存ではなく「解放されない」が正しい
2016-12-07 14:14:47
reallocも難しすぎる関数として有名だが、「sizeが0じゃないことを確認する」という注意はするけど、あえてfree関数の代わりとして明示的にsizeに0を渡すという使い方はしないから、この辺のコーナーケースは理解してなかった
2016-12-07 14:17:33
reallocがNULLを返して来たときの対処として、「上流へエラーを返す」だけではなくて、「ptrは有効のままだから別途だれかがfreeしないといけない」というのは忘れがち。まーメモリアロケーションが失敗するときはリカバリ不能なことが多いから、あんまり問題にはならんのだけど
2016-12-07 14:21:58