10周年のSPコンテンツ!
12
AoiMoe a.k.aしお兄P @AoiMoe
だいたい、reallocとfreeだけあれば十分なのにmallocとcalloc用意してるんだから、bzeroも用意しろよ!<またそれか
AoiMoe a.k.aしお兄P @AoiMoe
@AoiMoe あっ、freeも要らなかった。reallocだけあれば十分だった
ELD-R-ESH-2 @eldesh
@AoiMoe reallocがあればfree要らないですよね?
ELD-R-ESH-2 @eldesh
んー? reallocに0サイズ指定するとfreeになるって何処に書いてあるんだ?どっかの細則かな
yoh @yohhoy
reallocはfreeの代用にはならんのでは?
ELD-R-ESH-2 @eldesh
@AoiMoe やっぱり間違いかも知れません。sizeに0を指定するとfreeされるけど返り値として有効なアドレスが返ってくることがあるので0サイズの領域を指すポインタが永久にdeallocate出来ないのでは…?
ELD-R-ESH-2 @eldesh
@yohhoy これ読んで出来ると思い込んでたんですが、ダメですか? | size が 0 で ptr が NULL でない場合には、 free(ptr) と等価である。 linuxjm.osdn.jp/html/LDP_man-p…
yoh @yohhoy
@eldesh en.cppreference.com/w/c/memory/rea… ちゃんと当たってないですが こんな記述もあって微妙かも?
ELD-R-ESH-2 @eldesh
@yohhoy なるほど。やはりdeallocateだけを行う手段は無さそうに見えますね。 私の見解> twitter.com/eldesh/status/…
ELD-R-ESH-2 @eldesh
もうrealloc廃止にしよう(提案)
omni 鳥頭 @kariya_mitsuru
realloc の 0 は、今の Linux は free と等価、今の UNIN の規定では処理系定義、C 言語では規定無し、かな?
ELD-R-ESH-2 @eldesh
@AoiMoe ハイ。ただC言語の現在のドラフトで確認したところ §7.22.3.5 realloc function deallocates the old object とは書いてあるのでそこは確実だとは思います。(返って来るモノがあやしい
AoiMoe a.k.aしお兄P @AoiMoe
@eldesh ああなるほど、解放はされるけど何が返ってくるかは実装依存だから無視せよってことですね。既に無効な第一引数がそのまま来るかもしれないし、あるいは内部で使われたeaxレジスタのゴミが返ってくるかもしれないとか。
ELD-R-ESH-2 @eldesh
@AoiMoe いえ。戻ってくるのはNULL、またはfree出来る有効なポインタ(ただしサイズ0なのでデリファレンス出来ない)です。どっちが来るかは実装依存だと思います。後者が来る場合はそれもfreeしたいんですけど、そこでreallocを使うとまた別のポインタが…。
AoiMoe a.k.aしお兄P @AoiMoe
@eldesh なるほど。まあ普通に考えて、「常にfreeされる」か「常にfreeされない」かの二択でしょうね。
AoiMoe a.k.aしお兄P @AoiMoe
あれ、C11のreallocはsizeが0の時の話は一切書いてない。
AoiMoe a.k.aしお兄P @AoiMoe
NULLが返ってくるのは「新しいオブジェクトがアロケートできなかった場合」であり、その場合には「古いオブジェクトは開放されず、ptrは有効なまま残る」と書いてある。どう考えても実装依存ではなく「解放されない」が正しい
AoiMoe a.k.aしお兄P @AoiMoe
reallocも難しすぎる関数として有名だが、「sizeが0じゃないことを確認する」という注意はするけど、あえてfree関数の代わりとして明示的にsizeに0を渡すという使い方はしないから、この辺のコーナーケースは理解してなかった
AoiMoe a.k.aしお兄P @AoiMoe
reallocがNULLを返して来たときの対処として、「上流へエラーを返す」だけではなくて、「ptrは有効のままだから別途だれかがfreeしないといけない」というのは忘れがち。まーメモリアロケーションが失敗するときはリカバリ不能なことが多いから、あんまり問題にはならんのだけど
まかべひろし @sinpen
え、realloc()にsize=0渡すとfree()するんだ。そういう使い方したことなかったな
tnozaki @tnozaki
POSIXではrealloc(p, 0)はfree(p)と同義だけどISO-Cではその限りではないだっけか
残りを読む(35)

コメント

tnozaki @tnozaki 2016年12月10日
まとめを更新しました。
tnozaki @tnozaki 2016年12月10日
まとめを更新しました。
tnozaki @tnozaki 2016年12月14日
まとめを更新しました。
tnozaki @tnozaki 2016年12月14日
まとめを更新しました。
前橋和弥/ポインタ完全制覇改訂版発売! @kmaebashi 2017年3月5日
今頃ですが。C99(の和訳であるJIS X3010:2003)には「又は領域がfree 関数若しくはrealloc 関数の呼出しによって解放されているとき,その動作は,未定義とする。」という記載があり(C11も同様)、この文は、realloc()にメモリを解放する機能がないと成立しないと思うんですが……
前橋和弥/ポインタ完全制覇改訂版発売! @kmaebashi 2017年3月5日
ああ、これは7.20.3.4の冒頭の「realloc 関数は,ptr が指す古いオブジェクトを解放し,大きさがsize である新しいオブジェクトへのポインタを返す。」における「解放」と解釈できますね。失礼しました。
ログインして広告を非表示にする
ログインして広告を非表示にする