Togetter/min.tを安心してお使い頂くためのガイドラインを公開しました。
編集可能

realloc(3)の非互換性

こっちにまとまってますhttp://qiita.com/AoiMoe/items/0e654a81d2ee70792070
12
AoiMoe a.k.aしお兄P @AoiMoe

だいたい、reallocとfreeだけあれば十分なのにmallocとcalloc用意してるんだから、bzeroも用意しろよ!<またそれか

2016-12-07 11:44:57
AoiMoe a.k.aしお兄P @AoiMoe

@AoiMoe あっ、freeも要らなかった。reallocだけあれば十分だった

2016-12-07 11:46:46
ELD-R-ESH-2 @eldesh

@AoiMoe reallocがあればfree要らないですよね?

2016-12-07 12:56:42
ELD-R-ESH-2 @eldesh

んー? reallocに0サイズ指定するとfreeになるって何処に書いてあるんだ?どっかの細則かな

2016-12-07 13:13:51
yoh @yohhoy

reallocはfreeの代用にはならんのでは?

2016-12-07 13:19:57
ELD-R-ESH-2 @eldesh

@AoiMoe やっぱり間違いかも知れません。sizeに0を指定するとfreeされるけど返り値として有効なアドレスが返ってくることがあるので0サイズの領域を指すポインタが永久にdeallocate出来ないのでは…?

2016-12-07 13:24:11
ELD-R-ESH-2 @eldesh

@yohhoy これ読んで出来ると思い込んでたんですが、ダメですか? | size が 0 で ptr が NULL でない場合には、 free(ptr) と等価である。 linuxjm.osdn.jp/html/LDP_man-p…

2016-12-07 13:25:08
yoh @yohhoy

@eldesh en.cppreference.com/w/c/memory/rea… ちゃんと当たってないですが こんな記述もあって微妙かも?

2016-12-07 13:27:29
ELD-R-ESH-2 @eldesh

@yohhoy なるほど。やはりdeallocateだけを行う手段は無さそうに見えますね。 私の見解> twitter.com/eldesh/status/…

2016-12-07 13:34:41
ELD-R-ESH-2 @eldesh

もうrealloc廃止にしよう(提案)

2016-12-07 13:36:03
かりやみつらない @kariya_mitsuru

realloc の 0 は、今の Linux は free と等価、今の UNIN の規定では処理系定義、C 言語では規定無し、かな?

2016-12-07 13:37:47
ELD-R-ESH-2 @eldesh

@AoiMoe ハイ。ただC言語の現在のドラフトで確認したところ §7.22.3.5 realloc function deallocates the old object とは書いてあるのでそこは確実だとは思います。(返って来るモノがあやしい

2016-12-07 13:44:02
AoiMoe a.k.aしお兄P @AoiMoe

@eldesh ああなるほど、解放はされるけど何が返ってくるかは実装依存だから無視せよってことですね。既に無効な第一引数がそのまま来るかもしれないし、あるいは内部で使われたeaxレジスタのゴミが返ってくるかもしれないとか。

2016-12-07 13:55:09
ELD-R-ESH-2 @eldesh

@AoiMoe いえ。戻ってくるのはNULL、またはfree出来る有効なポインタ(ただしサイズ0なのでデリファレンス出来ない)です。どっちが来るかは実装依存だと思います。後者が来る場合はそれもfreeしたいんですけど、そこでreallocを使うとまた別のポインタが…。

2016-12-07 14:01:18
AoiMoe a.k.aしお兄P @AoiMoe

@eldesh なるほど。まあ普通に考えて、「常にfreeされる」か「常にfreeされない」かの二択でしょうね。

2016-12-07 14:05:15
AoiMoe a.k.aしお兄P @AoiMoe

あれ、C11のreallocはsizeが0の時の話は一切書いてない。

2016-12-07 14:11:59
AoiMoe a.k.aしお兄P @AoiMoe

NULLが返ってくるのは「新しいオブジェクトがアロケートできなかった場合」であり、その場合には「古いオブジェクトは開放されず、ptrは有効なまま残る」と書いてある。どう考えても実装依存ではなく「解放されない」が正しい

2016-12-07 14:14:47
AoiMoe a.k.aしお兄P @AoiMoe

reallocも難しすぎる関数として有名だが、「sizeが0じゃないことを確認する」という注意はするけど、あえてfree関数の代わりとして明示的にsizeに0を渡すという使い方はしないから、この辺のコーナーケースは理解してなかった

2016-12-07 14:17:33
AoiMoe a.k.aしお兄P @AoiMoe

reallocがNULLを返して来たときの対処として、「上流へエラーを返す」だけではなくて、「ptrは有効のままだから別途だれかがfreeしないといけない」というのは忘れがち。まーメモリアロケーションが失敗するときはリカバリ不能なことが多いから、あんまり問題にはならんのだけど

2016-12-07 14:21:58
まかべひろし @sinpen

え、realloc()にsize=0渡すとfree()するんだ。そういう使い方したことなかったな

2016-12-07 14:22:44
tnozaki @tnozaki

POSIXではrealloc(p, 0)はfree(p)と同義だけどISO-Cではその限りではないだっけか

2016-12-07 14:23:42
残りを読む(35)

コメント

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