K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2211] c言語ポインタ完全制覇 realloc
返信


投稿者:774RR
2020/01/06 19:18:48

Link:
オイラは買っていませんが [2206] で
> variable_array = realloc(variable_array, sizeof(int) * size);
と引用されていますね。典型的やってはダメと巷で解説されている例でしょう。

realloc() に失敗したとき nullptr が返され、旧 variable_array の領域を指すポインタがなくなってしまうので free() できなくなり、リークする
というのがよくある解説なわけです。

でもまあ realloc() に失敗するような状況だとほかの処理も一切できなくて終了するしかない、ってのが実情で、
どうせ終了するんだったら現コードでもまいっかと思うわけですが Maebashi さんはどう思います?


[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2212] Re:c言語ポインタ完全制覇 realloc
返信


投稿者:(ぱ)こと管理人
2020/01/08 02:18:07

Link:
おや、ごぶさたしております。

>オイラは買っていませんが [2206] で
>> variable_array = realloc(variable_array, sizeof(int) * size);
>と引用されていますね。典型的やってはダメと巷で解説されている例でしょう。

この箇所、書籍では、地の分で
| List4-4では,ユーザーがint型の値を入力するたびに,realloc()を使って
| variable_arrayを拡張しています(ここでも,戻り値のチェックは省略しています).

と書いておりまして、「戻り値のチェックは省略しています」という言い訳を付けています。
realloc()の挙動を知るためのサンプルプログラムとしてはありではないでしょうか?

ではサンプルではない場合にどうするかといえば、
malloc()だろうとrealloc()だろうと直接呼ぶのはそれ自体NGで、
なんらかのラップをかぶせ、「死ぬしかないにしても、(Segmentation faultではなく)
メモリ不足で死んだことがわかるようにする」というのが最低限の対策だと
思っています。

>でもまあ realloc() に失敗するような状況だとほかの処理も一切できなくて
>終了するしかない、ってのが実情で、

20年近く前に
http://kmaebashi.com/programmer/c_yota/malloc.html
の「戻り値チェック」のところにいろいろ書いてて、書籍の方にも似たことを
書いています。 
JavaでOutOfMemoryErrorをcatchもしないくせに、Cでmalloc()の戻り値だけ
気にしたってしょうがない。それを言うならRubyなんてかつてはmalloc()が
NULLを返しただけで(適切なエラーメッセージも出さず)Segmentation faultで
落ちまくってたぞ、と言いたいですねえ。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2213] Re:c言語ポインタ完全制覇 realloc
返信


投稿者:774RR
2020/01/08 06:54:29

Link:
お久しぶりです。1月に1回くらいは掲示板チェックしてましたよ。

> 「戻り値のチェックは省略しています」という言い訳を付けています。
それなら問題ないっす。この手の解説書き始めると数ページを要してしまうし、
紙面に制約がある状況で本筋からずれた詳細を記載してもねー、と思うわけっす。
# ページに余裕があるなら数行の「コラム」にするのはアリかもしれない。

p=realloc(p, sz); のコードに対して静的解析ツールが警告出したりするので
QAC 絶対主義みたいな頭の固い上司がこのコードにウンと言わない場合が
あったりするとかなかったりするとか。

組み込み系では RAM 8KiB をコード実装に入る前の設計段階で静的に割り振って
動的確保なんぞありえないってケースが大半なので、そういう点でオイラは楽できてます。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2214] Re:c言語ポインタ完全制覇 realloc
返信


投稿者:(ぱ)こと管理人
2020/01/12 17:02:50

Link:
>p=realloc(p, sz); のコードに対して静的解析ツールが警告出したりするので
>QAC 絶対主義みたいな頭の固い上司がこのコードにウンと言わない場合が
>あったりするとかなかったりするとか。

まあそれはそれで必然性がないわけでもないので、よろしいのではないでしょうか。

>組み込み系では RAM 8KiB をコード実装に入る前の設計段階で静的に割り振って
>動的確保なんぞありえないってケースが大半なので、そういう点でオイラは楽できてます。

新人時代、ワークステーションなのに上司がmalloc()禁止と言い出して、
結局、巨大配列から動的に切り出す仕組みを作りかけたのを思い出しました。
(最終的には説得に成功した)
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2215] Re:c言語ポインタ完全制覇 realloc
返信


投稿者:774RR
2020/01/14 14:23:20

Link:
>結局、巨大配列から動的に切り出す仕組みを作りかけたのを思い出しました。
それなんてオレオレ malloc ?

数バイト単位の alloc/free が高頻度で必要
L1 キャッシュヒット率を落とさないよう free 直後領域の再利用を優先するべし
みたいな案件でオレオレ malloc/free 相当の関数は組んだことが過去にありました。
でも苦労した割にはそこがボトルネックではなかったでした。
それ以後は実測せずに思い込みの最適化をするなと口酸っぱく言ってます。

まあとりあえず p=realloc(p, sz); は一応注意喚起対象ってことで。
書籍の著者の掲示板まで読んでいる人には周知の事実かもしれませんが。
[ この投稿を含むスレッドを表示] [ この投稿を削除]