mallocの後にfree不要と言うバカいるの?Part2
■ このスレッドは過去ログ倉庫に格納されています
fjの時代から10年以上に渡るmalloc/free問題について語ってください(^q^)
前スレ
main以外★mallocの後にfree不要と言うバカいるの?
http://toro.2ch.net/test/read.cgi/tech/1352812333/ ここまでのまとめ
・freeいる派完全勝利
・freeいらない派のくさおが発狂、レスを流すのに必死
・freeいらない派のくさおがバグ付スタックオーバフローソースを作成、
身をもってfreeは危険だと主張
・freeいらない派のくさおが自演を開始、自画自賛を始める
・freeいらない派のくさおが自演を指摘され遁走 ←いまここ 前スレ1
1 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/13(火) 22:12:13.29
前提1:一般的なC言語(GC搭載していない)
前提2:main関数は除く
前提3:関数実行後すぐに終了するとは限らない
前提4:関数は何度も使われることがある
これがメモリリークするのは当たり前の話で、
mallocをしたらfreeするのは当たり前。
free不要論とは一体何だったのか。
天邪鬼(バカ)が言葉尻を捉えていただけではないだろうか。
まつもと ゆきひろもそのバカの一人だったらしいね。
例外中の例外を除いて、mallocをしたらfreeは必要。
これが真の答えだろう。 freeいる派の主な主張
・mtraceが通らないとか論外
・対にするようにしておかないと悪癖が身に付く
・そもそも最後にまとめて解放すること自体が論外
freeいらない派の主な主張
・freeでバグる可能性があるから解放したくない
・プロセスの終了処理に黙って解放されるほうが終了処理がはやい なんかスレ立てたら賢者モードになっちゃったよ。
前スレで議論してたのがうそみたい。
ところで、Perl、Python、RubyなんかのP言語が猛威をふるい
Javaなんかもガベコレ積んでるし、
Windowsアプリの主要開発言語もC#になろうかとしている今、
今後、手動でメモリ確保、メモリ解放しなきゃならない環境ってのは
どういうのが残るかなぁ
AppleのObjective-C、組み込み開発、ドライバ、OS等のハードに直結した部分
数値計算とかそういう純粋に速度が要求される分野
思いついたのはこのくらいなんだけど
他にないかなぁ このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所 「main 以外」なんだからねっ!
不毛な議論しちゃダメ、絶対。
ところで、exit 適用時も議論対象外に、入りますか? こっちが本スレで向こうが隔離スレでしょ
この議論はUNIXの"悪習"が元凶のような気がしてきた 俺もOS評価するときにOS再インスコが
必要になったらPCの電源をブチっと
落とすけど、そんな感じ? 使い捨てのプログラムで、コンパイラみたいな一度走って終わりのプログラムなら、
全部mallocしっぱなし、ってこともある。時と場合による。 "main以外"を抜いて、また1からやり直したいのか?>>1は >>13
どっちかというと、再インストール関係なしに「もうディスクにアクセスする必要が
ないことがわかっているから」といってrebootのかわりにリセット押すのが近いだろう。 スレチだが、
sprintf(buf,…);
len=strlen(buf);
という低脳なコードを久しぶりに見たw 946 :デフォルトの名無しさん:2013/01/29(火) 22:41:57.29
そもそも最後にまとめて解放すればいいという設計がおかしいんだよ。
最後にまとめて解放するくらいならプロセスの終了に任せれば、って
話になるのはそのため。
mtraceの話も出てるけど、リストだろうがツリーだろうが、使っていると
認識している箇所だけを正しく解放していって、最後に何が残るかを
見ないとリークしてるかどうかなんてわからないだろ。
最後にツリーまとめて消してみたら全部消えたのでリークしてません、
なんてことにはならないんだから。
そこに解放したつもりになっているデータが連結されているかどうか
というのが重要なのに。
947 :デフォルトの名無しさん:2013/01/29(火) 22:45:04.83
こりゃまた大きな釣り針だな。www
948 :デフォルトの名無しさん:2013/01/29(火) 22:47:30.66
くさお悔しくて絶好調だな
949 :デフォルトの名無しさん:2013/01/29(火) 22:47:59.75
>>946
まとめて消して消えるならリークしてないだろ。バカか。 >>17
それやったことあります。汚物見せてごめんなさい。 >>17
そういうコードが必要な場合もある。
どういう場合かは、あんたには分からんだろうがね。 >>21
1行目と2行目でbufの内容が変わることは100%あり得ない
と思ってんだろ?素人君 >>22
はい。100%あり得ません。
bufが共有であるならセマフォなり何らかの排他をしないのは単なるバグです。 >>17
俺も数えるのめんどくさくてやってしまいそうだが。正解は? >>23
あれを見た瞬間にその「単なるバグ」の可能性にまで気づくかどうかの問題
後出しでは意味なし >>25
>そういうコードが必要な場合もある。
じゃあ後出しでない回答を期待します。
逃げたければ逃げてもいいですよ。 >>26
もう答えはでている
あんたが理解できていないだけだ >>24
len = sprintf(buf,…); 「低脳」
草生やし
卑屈で低レベルな煽り
…まともに相手する必要を認めず。 議論を勝ち負けで考えているかぎり
お前らの勝ちは一生ありえないよ。 >>22
そもそも2行目が不要なことを理解できない低脳君乙。 > スレチだが、と言って、脈絡もなく>>17を投下したのはこのスレの
異常に高いバカ召喚性能を使いたかったからだろ。wwww
釣られたバカが>>22 wwww つられたバカが悔しがってるな。 wwww
なんでバカって簡単につられるんだろう。 あっ、バカだからか。wwww >>22が書きそうなコード
if(p!=NULL)free(p); >>37
> if(p!=NULL)free(p);
それも、いま知るまでやっていました… >>38
基地外スレであんまり真面目ぶると、逆に工作員認定される sprintfは使用禁止。バカしか使わない。wwww
釣られた>>22 バカすぎ wwww
> From: [22] デフォルトの名無しさん <sage>
> Date: 2013/02/03(日) 06:45:51.40
>
> >>21
> 1行目と2行目でbufの内容が変わることは100%あり得ない
>
> と思ってんだろ?素人君 >>38
freeにNULLを与えた時の動作が標準化されたのはC89からだったはずだから、
20年くらい前のソースならそのように書かれていても不思議じゃない。
作ったライブラリが予想もしない所で使われるかもしれないから、
freeしろとかほざいているfreeバカは、NULL与えるとSEGVする環境(SystemV)に
持って行かれるかもしれないからチェックしろとか言わないのか? wwww 終了時にメモリ解放してくれるのはどのC言語の規格書に書いてるの? >freeにNULLを与えた時の動作が標準化されたのはC89からだったはずだから、
馬鹿死ね
K&R1 からだ
realloc(NULL, size); がmalloc(size) と等価にならないかわいそうなバグがある処理系が存在した話であればこれは有名 >>37
コンパイラが最適化してくれるので問題ありません。 >>45
しない
コンパイラからはfree() は単なる一つの関数にしかみえない
p が 0 のとき free(p) はなにもしないことは、コンパイラはしらない
勉強不足だ、これではwww野郎やQZすらの相手にもならない
死ね >>46
コンパイラがライブラリの仕様を把握していないと矛盾が生じます。
printfが書式文字列に従って値を表示することをしらなければ出せない
はずの、書式文字列と引数があっていないときのwarningを出せます。
同じように、if(!p)free(p)という悪しき慣例があることも知っています。 >>47
ではfree(0)を省いてくれる処理系を挙げてみよ
できないのなら市ね >>48
>書式文字列と引数があっていないときのwarningを出せます。
ほう、それはgccだねこれは一本とられた。よく頑張ったね。 >>49
なんでfreeのほうを省くの?バカなの?死ぬの? >>50
×それはgccだね
○俺はgccしか知らない 本日の大バカ晒しage
49 :デフォルトの名無しさん:2013/02/03(日) 13:47:08.31
>>47
ではfree(0)を省いてくれる処理系を挙げてみよ
49 :デフォルトの名無しさん:2013/02/03(日) 13:47:08.31
>>47
ではfree(0)を省いてくれる処理系を挙げてみよ
49 :デフォルトの名無しさん:2013/02/03(日) 13:47:08.31
>>47
ではfree(0)を省いてくれる処理系を挙げてみよ
49 :デフォルトの名無しさん:2013/02/03(日) 13:47:08.31
>>47
ではfree(0)を省いてくれる処理系を挙げてみよ >>51
const char *p = NULL;
free(p);
だったら最適化でfree(p)を消してくれるかもねw 逆に、mallocがNULLを返したかチェックしない人多いよね。
LinuxではNULLが返ってくることはないというのが理由らしいんだけど。 OOM Killerで他のプロセスが殺されるとか、糞仕様すぎる。 >>44
> 馬鹿死ね
> K&R1 からだ
古い規格に詳しいな、ジジイ。 で、それが何か? wwww >>46
お前がオレさまの相手をするのは、バカすぎて無理。wwwww
うんこQzからかって遊ぶだけにとどめておけ。wwww
その処理系のライブラリが
inline void free(void *p)
{
if (p)
read_free(p);
}
という実装だったら、
> if(p!=NULL)free(p);
はコンパイラが最適化できる。 wwww >>59
> realloc(NULL, size); がmalloc(size) と等価にならないかわいそうなバグがある処理系が存在した話であればこれは有名
「これは有名」の「これ」とは何かね? wwww
バカの文章は読みにくい。 wwww >>45
コンパイラが最適化してくれるというのは、そうかも知れない。
でも、しないかもしれない。
また、それは可読性を下げてまでやるべき事ではないと思うがな。
もしかして IOCCC に出品するつもりとか?
そして、やり方としては、無茶な仕事を下請けへ丸投げするのと
全く同じなんだよね。
技術的な裏付けは何にも無いけど、彼奴等に投げておけば
何とかするだろう、レベルの発想。 >>62
えっと、if文1個式1つで可読性が悪くなるとか、
頭悪いんですか?悪いんですね。 >>55
そうなのか?少なくともヒープとして使えるメモリ空間使い果たせば返ってくるだろ。
>>56,57
vm.overcommit_memory あたりでググってみるといいかも。
ただでっかいメモリ空間を使っているプロセスから fork & exec していたりする時は注意。 それは↓を言う前に言うべきだったね。 wwww
自信たっぷりに否定した後で、可能な事を示されてからじゃ遅い。 wwww
お前はヘボなんだよ。wwww ヘボ同士でうんこQzと絡んでるのがお似合い。wwww
本日のバカ wwww
> From: [46] デフォルトの名無しさん <sage>
> Date: 2013/02/03(日) 13:37:59.35
>
> >>45
> しない
> コンパイラからはfree() は単なる一つの関数にしかみえない
> p が 0 のとき free(p) はなにもしないことは、コンパイラはしらない
> 勉強不足だ、これではwww野郎やQZすらの相手にもならない
>
> 死ね
>>45は前スレのオレの真似をして煽っただけだろう。
十中八九inlineで最適化なんて思いついていない中防。。
そんなのに釣られてバカ晒す事になった>>46が憐れでならない。 wwwww >>62
呼ばなくていいなら関数呼び出しは少ないほうがいい場合もある。
そういう意味でif (p) free(p)は、意味はある。
機械語にしたところでfreeを呼ぶためにレジスタにロードするので
zeroチェックはそのついでで行うことができるし、ifのほうは
大したペナルティにはならない。 freeがinlineになっているクソな処理系ってなんだよ。 >>64
linux上でman mallocをよく読め。 >>67
NULLがzeroだなんて誰が決めたの? NULLは(仮に機械表現が全ビット0でなかったりしても)コンパイラ(言語)の上では0だよ?
そんなことも知らずにこんなスレで暴れようと思ってるの? >>60
>その処理系のライブラリが inline void free(void *p)
お前も馬鹿か?
標準ライブラリがソースで提供されているとでも?
普通はobjやlibではないか?
そんなバイナリをインラインにできるとでも?
死ね >>61
やさしい日本語しかよまない/よめない馬鹿なんだね、指示詞を敢えて差し込むのはよくやること
>前項の目的を達するため、陸海空軍その他の戦力は**これを**保持しない。
>国の交戦権は**これを**認めない。
>> realloc(NULL, size); がmalloc(size) と等価にならないかわいそうなバグがある処理系が存在した話であればこれは有名
>「これは有名」の「これ」とは何かね? wwww
「realloc(NULL, size); がmalloc(size) と等価にならないかわいそうなバグがある処理系が存在した話」
だね
死ね len = sprintf(buf, "%c", 0)
len => 1
strlen(buf) => 0 >>75
で、それが、
「freeにNULLを与えた時の動作が規定されたのはC89ではなくてK&R1だ」となんの関係があるんだ? wwww しかしこのネタは昔から盛り上がるんだけれど、リアルで素のmallocをアプリレベルでそんなに呼ぶものなのか?
組み込み云々言っている奴もいたけれど、俺が関わってきた範囲では分断の問題で直接使うことはないな。
素のmalloc/freeは遅くて使い物にならないって環境って場合もあったけど。
最近はRAM自体はそこそこのっている環境も多いんでスタック増やして、C99にして可変長配列使うっていう手で
かなりの部分が楽になった。
人命云々言っている奴、プロセスの概念がある世界ならば、なるべくプロセスの寿命を短くするって方向も
考えたほうがいいぞ。最初からmalloc/freeだけに限らずバグの全くない大規模なプログラムなんて
妄想だと思ってシステム作ると、頑強なものができるから。 マルチスレッドだと、スタックサイズが固定になるのでautoにでかいのを置くことは
必然的に避ける事になる。 これ位は常識だぞ。 wwww
> 最初からmalloc/freeだけに限らずバグの全くない大規模なプログラムなんて
free楽勝と豪語しているfree必須バカは全くバグのないプログラムを作れるらしいぞ。wwww >>69
>>65のどの部分がおかしいか教えてくれ。マジでわからん。
vm.overcommit_memory=2 でも malloc が成功しても実際には使えないことがあるってことか? >マルチスレッドだと、スタックサイズが固定になる
無知発見w >リアルで素のmallocをアプリレベルでそんなに呼ぶものなのか
>素のmalloc/freeは遅くて使い物にならないって環境って場合もあったけど
自分が特殊な環境にいたと自負してる時点で1行目が死んでるよ >>82
はい。
Linuxの楽観的メモリ管理はその程度ではどうにもなりません。 >>83
あっそ、pthreadでもWin32でもスレッド生成時のスタックサイズを超える事は出来ないけど、
それを伸ばしてくれるスレッドライブラリってどれだよ。www >>82
いや、常識的にユーザーにその設定書き換えてくださいとは言えないだろ…
root権限ないとだめだし自分のプログラムだけに影響するわけでもないし >>81
> マルチスレッドだと、スタックサイズが固定になるのでautoにでかいのを置くことは
> 必然的に避ける事になる。 これ位は常識だぞ。 wwww
おいおい、組み込みの世界だと元々スタック1Kとかふつーだったのが、それを64Kにすれば
楽できるとかそういうレベルの話だよ。 >>86
>スレッド生成時のスタックサイズを超える事は出来ない
生成時には可変であることを認めましたね?おバカさんw >>79
関係ないね。この超有名な話と混同しているのではないかと勘繰っただけでね
死ね >>80
確かに素のmalloc()/free() を直にソースに散らばらせるのは好ましくないね
QZですらアロケータ経由だったようだし
昔のlisp処理系ではタイプごとにアロケータを別に準備していたようだねセル用とかね64KiBのシステム用だったけれど >>55
32ビットだとメモリ空間は4Gだろ。32ビットlinuxでmalloc(1M)を繰り返すと、
4097回目には何が返ってくる?
ああ、返さずに自殺という選択肢もあるか。 >>81
>free楽勝と豪語しているfree必須バカは全くバグのないプログラムを作れるらしいぞ。wwww
楽勝とはいっていないがmalloc()/free()くらいは完全に管理できるだろうねアロケータを準備したりしてね
お前はそれができないからmalloc()/free()を使わないんだろう?
死ね >>86
スレッド生成時には好きに変えられるんだ馬鹿
死ね >>90
憲法すら読んだことがないとはねえ
中卒? >>89
CreateThreadは引数でスタックサイズ与えるんだから自明の事。www
pthreadしか知らないバカか。 wwwww >>98
自明なのに「マルチスレッドだと、スタックサイズが固定になる」
って言いきった人がいるらしいですよw
生成時にいくらでも変えられるのにどのへんが固定なんでしょうねw ■ このスレッドは過去ログ倉庫に格納されています