mallocの後にfree不要と言うバカいるの?Part2
■ このスレッドは過去ログ倉庫に格納されています
fjの時代から10年以上に渡るmalloc/free問題について語ってください(^q^)
前スレ
main以外★mallocの後にfree不要と言うバカいるの?
http://toro.2ch.net/test/read.cgi/tech/1352812333/ >>459
> このようなケースは結構多いと思うんですよ。
自分が作るソフトもそうなの?
まあ、そうだとしても構文木を作成してる所以外でリークしない自信があるとか、リークしても気にしないと言うなら止めないよので、自由にやってくださいな。 >本質的に記憶領域の再利用がされないfreeをするために
>循環参照があるリンクトリストを再帰で開放してまわったり
>freeをするための1万回のループをわざわざ書くというのは
>なんというか、知的ではないのではないかと
リスト要素の構築と破棄を一回書けばそれが何万回呼ばれようと
同じだと思うんだが、それを「わざわざ」と言うのはどういうスタイルで
書いてんのか気になるな。
循環参照とか言っているところを見ると、fjのときも出てきたような
「作った本人が正しく破棄することができないデータ構造」とかかねぇ。 RAIIはおろかな考えというネタでもう一スレ作れそうな気がするな。 >>467
> リスト要素の構築と破棄を一回書けばそれが何万回呼ばれようと
> 同じだと思うんだが、
パフォーマンス的には全然同じじゃないよ
コードの字面的に呼び出しが無かったら処理が存在しないとでも思ってるの?馬鹿? ちなみに>>469は俺です。
あと500レスみんなで頑張ってください。 リンクドリストの場合はmallocすら何回もするのがめんどくさいので、
ブロックで確保して破棄はブロックの数分だけでいいのでは?
ゲームでは常識。 >>467
わかりにくい書き方ですみません。
前半の部分は
http://www.slideshare.net/iwiwi/ss-11008471
の3ページの交通ネットワークを表すために
31ページみたいなグラフを作って、その解放コードを
ちまちま、解放することを考えています。
後半は、行列なんかを使った後に
for(i = 0; i < ROW_MAX; i++) {
free(row[i]);
}
free(row);
exit(0);
なんてことをやることを想定しています。 行列は幅が変わらないので、W*Hで確保してW*y+xすれば何度も確保する必要ない。 >>447
わからないから、教えて下さいだろ。池沼。 >>469
> パフォーマンス的には全然同じじゃないよ
で、そのパフォーマンスが問題になってるの? >>472
前者は、参照の所有権をちゃんと考えないで複雑なデータ構造を作っちゃうと
いざ壊そうと思ったときに嵌ったりバグったりする典型だね。
後者は、使い捨てのやっつけプログラムとかじゃなければ普通こんなコードが
exit()の直前に置かれることはないと思うし、そうであれば普通に破棄処理として
書くと思うんだけどなぁ。それを「わざわざ」と思うのはまぁ、個人の感覚かも知れんが。
#あぁ、rowもグローバル変数だったりするのかね? >>476
問題になってるかどうかはどうでもよくね?
1ナノ秒でも1ミリ秒でも速いほうがいいだろう?
速くなることにメリットはあれどデメリットはない。 >>478
小手先の最適化をバンバンやれと言う主張ですね
まあ、頑張ってくださいな w >>479
ちりも積もれば山となるってことわざ知らないの?
1ナノ秒でも積もれば1時間になるんだけど。 >>477
> 前者は、参照の所有権をちゃんと考えないで複雑なデータ構造を作っちゃうと
> いざ壊そうと思ったときに嵌ったりバグったりする典型だね。
ですので、freeせずにOSの持つメモリ管理機構を利用して
exitですね。
freeするためにプログラムを作っているのではなく
データを扱うためにプログラムを作っているのですから。
メモリリークチェッカを使わなければならないとかで、絶対freeしろって
言われたらmyMallocとmyFreeを作って、全体をmallocして最後に
一発freeってやりたいです。
> 後者は、使い捨てのやっつけプログラムとかじゃなければ普通こんなコードが
> exit()の直前に置かれることはないと思うし、そうであれば普通に破棄処理として
> 書くと思うんだけどなぁ。それを「わざわざ」と思うのはまぁ、個人の感覚かも知れんが。
なにをもってやっつけのプログラムと言うかはさており、
cpは実際にexitの前にforgetAllって終了処理が
word2vec
http://word2vec.googlecode.com/svn/trunk/word2vec.c
ではvocab, vocab_hash, expTableは解放するならmainからのreturn
直前に記述することになりますね。
> #あぁ、rowもグローバル変数だったりするのかね?
あくまで、例のための例ですが、グローバルなときもあります。
# というか、そのほうがすっきりする。 >>480
> ちりも積もれば山となるってことわざ知らないの?
知ってる。
だから、小手先の最適化なんてしないんだよ。
速さより、重要なことってあるんだよ。 速さよりも重要な事なんて無いよ。
金さえあればスパコンがほしいぐらい。 そーゆーレベルだとアルゴリズム工夫した方が早くならね? >>483
それは、正確さだなw
あと脆弱性への強さ。
コードの見通しのよさ、コードの柔軟さ。
速さがどーしても欲しいってのはリアルタイムOSとかそういう分野なのかなぁ? >>483
マルチスレッド使っての高速化とかは無理? >>483 は素早く間違った結果が欲しいんだろう w >>485
> 速さがどーしても欲しいってのはリアルタイムOSとかそういう分野なのかなぁ?
そういう分野は、速さと言うよりどんな場合でも決められた時間に間に合うこと(つまり、遅くならないこと)を要求される
ハードリアルアイム でググってみそ freeが必要だと思う人はしていただき、その必要性はないと思う人はしない
ということで各々ご対応をお願い致します。
それでは、ここらでお開きとさせていただきます。
皆様、活発な意見交換、誠にお疲れ様でございました。 >>475
わからないから、教えて下さいだろ。池沼。 >>403
ネタ主張を1400レスも続けるとかヒッデェなぁ… >>494
うんうん、そうだねー
で、説明は? w この問題の根は、ファイル名に日本語を使うべきでないや、メールタイトルに
日本語を使うべきでない、と同じです。
こういった問題について議論すると、必ず日本語を使うべきでないという結論に落ち着く。
しかし、本当の答えは、日本語が使えるべきです。
RAIIは多くの問題を論理的に解消できるので、常に使えるようにするべきです。
LinuxでRAIIが問題を引き起こすことは良く知られています。
メモリーの開放に時間がかかるので、メモリーの明示的開放を避けるべきという議論も
その一つです。
しかし、本当の答えは、Linuxでもメモリーの開放に時間がかからないようにすることです。
RAIIを避けるべきという議論は、過去に繰り返された日本語を使うべきでないという議論と同じです。 Linux以外なら、細かく何度もmallocして、しかもスワップアウトした領域を
freeして回っても遅く無いってか?馬鹿じゃないの? 先に大きめの領域確保して、開放すれば
細かく領域するときの速度が上げれるかもね
なんででしょうね? >>499
その問題の原因は、確保したメモリー領域の先頭に大きさなどの情報を持たせることです。
どれだけの大きさを開放するか調べるために遅い二次記憶から情報を復元します。
ですから、仮想記憶が一般的になると、多くのランタイムライブラリがメモリー管理を
OSに任せるようになりました。
メモリーの開放が直接OSによって処理されることで、OSは二次記憶から情報を取り出さずに
解放するタイミングを得ます。
残念ながらLinuxではそうなっていないため、メモリーを開放すると遅いので
解放するべきではないと主張する人が現れるようになりました。 exitする直前にfreeしないのは、OSのメモリ管理機能を利用してるってことなんだけど? >>502
>ですから、仮想記憶が一般的になると、多くのランタイムライブラリがメモリー管理を
>OSに任せるようになりました。
>メモリーの開放が直接OSによって処理されることで、OSは二次記憶から情報を取り出さずに
>解放するタイミングを得ます。
そんな非効率的なことをやってる環境があるの? VCのmallocはHeapAllocに丸投げする場合があるようだが、一般的かっていうと… 何を非効率と言いたいか知らないが、アプリがfreeしまくればメモリアクセスは当然発生する。
サクッと終了しちゃえば、OSはそのアプリに割り当ててたページをそのまま割り当て解除して
回収するだけ。
この効率の差を理解できないか、OSというものを理解してない発言でしかないわけだがwwwww >>510
で、その効率の差が実感できるアプリケーションってなに?
心のよりどころの cp だけ? w アプリ終了以外では
ある程度の大きさ以外は、freeしても割り当て解除はされませんよ
だから、ヘタすると、メモリ分断が怒って.... >>511 メモリを大量に確保するアプリならどれにでもあてはまる、
ということすら理解できないのかw >>513
> >>511 メモリを大量に確保するアプリならどれにでもあてはまる、
メモリの確保の仕方によって全然違うことも理解できないアホ乙 >>510
>>502の言うようにOSにメモリ確保を丸投げしてる場合、APIによってはOSも参照カウントの操作・確認も行うかもしれんぞ?
(例えば、WinのCreateFileMappingで確保したページファイル領域は生きたハンドル(を持つプロセス)があれば残る)
解放をOSに任せることで確実に軽減できるのは、アプリ側が解放すべきハンドルやポインタを走査するコストだけ。
その他のコストは実装依存でどのくらい軽減できるかが異なる。
…けど、これが問題になるケースも実装もそう多くないだろうからなぁ…
>>513
メモリ管理情報の操作に時間がかかってるんだから、小さい領域を山のように確保してるアプリじゃないか?
ポインタの走査にも時間がかかりやすい構造(馬鹿正直なリンクリストなど)だとよりコストが増える。 HeapAllocはプロセス内で確保したメモリを小分けして管理してるだけで、
それをOSの機能の一部みたいに扱うのはなんかモニョるな。 >>511
お前がひねり出したうんこプログラム全部 >>516
言いたいことは分かるがWin32APIって案外そういうの多いからなぁ…
user32とかkernel32にも標準CライブラリみたいなAPI(sprintfモドキも居るしw)が結構一杯ある。
MulDivやCopyMemoryみたいなのも居るし、CopyRectに至ってはただの32バイトコピー。
HeapAlloc程度でモニョってたらこいつらはモニョるなんてレベルじゃすまんぞw
MulDiv(32ビット値3つから中間値64ビットの掛け算と割り算)が何故カーネル扱いなのかと。 >>510
昔はそんなにメモリが潤沢になかったから、アプリが終了する前でも
不要になったら開放する方が、いろいろとよかった時代もあったんだよ
>>all
もうお前ら不毛だからこの辺にしとけ >>520
そうもいかない、そんな結論では C++ がいまだに営々と複雑化にこだわっている立つ瀬がない‥ メモリは動的に確保するくせに開放は静的にOSに任せたい
だったら、必要になるであろうメモリも配列で静的に確保しとけばいいんじゃね?
とか思うんだが…
でこういうこと言うと荒れるから、結論は
freeしたい人はして、したくない人はしない
で終了でいいんじゃね?っていう >>522
それは古来lispでもよくみられたプール式、cons セルという定サイズ領域を多量に使う用途で採用されているのをみたことがある 解放しないプロセスってデバッガで実行すると終了時に大量のleak検出を吐き出したりしないのか? 吐いたとしても意図的に吐かせてるつもりだろうから問題ないんだろ たぶんメモリリークしてもプロセス終了時に
全部解放されるんだから大丈夫だと思ってるんじゃない? リソースリークとメモリリークの区別もできないとかが典型例だな リークと解放の区別が付かないバカは死ねば良いと思う。 メモリリーク検出ツールでリークと解放の
区別がつかなくなるから解放しとけって話でしょw プログラム中で確保したメモリの各々がfreeする必要あるかないか、間違えずに
判断できる達人ならリークチェッカ使う必要ないな。 >>530を省略すると、
ミスをしない人はリークチェッカはいらない。
ということ。 リークチェッカなんて必要ない。
作った奴は馬鹿だ。
ミスをしなければいいだけの話。 ミスしてもいいのでは、修正できれば
いきなり完成品?作れる人いるのけ デバッグモードでコンパイルしたときだけ解放したら
良いだけじゃん馬鹿すぎ >>535
その修正をサポートするルールがリークチェッカでしょ?
で、free不要なんていって、free書いてないから
たくさん出るエラーの中から本当にリークしているものを
探して出すというマヌケな作業を行うwww
結論出たじゃん? freeは必要。 便利な道具がある。
とかいうとわからないでも出来ると勘違い... なんでfree関数というものがあるのかを考えればわかるよな
もう終わりだろ… 意図的にfree省略してる場合は>>536で済むってのは置いといても、
>>534ではリークチェッカ自体が不要と言っているのに、
>>537ではリークチェッカの為にfreeが必要って変な結論だなぁ… リークチェッカのエラーをなくすことが答えだと思ってる人もいますね
微妙な... リークチェッカーでリークを葬ったら、おもむろに選別していけば言いだけの話
というか、リソースリークの方が深刻でちょっと困っている おもむろに選別する効果・・・0.001秒速くなる。
デメリット、選別作業に数時間。
ドラブルあって、戻すのに数時間 >>542
リソースの確保・開放処理をリークチェッカと同じ仕組でラップしよう。 >>544
api の数だけラップを用意するのもなんだかね‥ C++だと、動的確保って
int *a = new int;
/*
aを使った処理
*/
delete a;
みたく書くと思うけど、deleteしないとアプリケーションを終了させても
確保されっぱなしだよね?
free()不要とか言ってるやつは、上記でいうdelete不要って言ってるのと
同じだよね? newは互換性のためにmallocで実装されてると聞いたことがある。ほんとか知らんけど。 >>546
>deleteしないとアプリケーションを終了させても確保されっぱなしだよね?
いや、それはない。アプリ終了時にアプリの使用していたメモリは OS が解放する。これは基本的な共通認識。
それをみこして free()/delete を@まったくしないでもいい、A選別して使用しないのもありだ、B信者ならどんな new/malloc() も必ず delete/free() すべきだ、真っ向に対立している。 C++なら、メモリマネージメントクラス書くでしょ。その前にstd::vectorあるけど。 Jane使ってる人は分かると思うけど、一度に多量の画像を保存する機会が多いと思う
そしてJaneは一度立ち上げたらOS再起動するまで大抵立ち上げっぱなし
そんな状態で画像の展開領域のためにmalloc()もしくはnewしたメモリをfree()やdelete
しなかったらどうなる?これ32bitアプリでしょ?120〜150枚ほど画像を開くと、例えば俺の
環境の場合Windows8.1だからJaneには2GB割り当あられるけど、free()しないとすぐに
メモリがなくなっちゃうね delete/free()不要って言ってる人って、もはやなぜメモリを動的に確保するのか?
の意味を見失ってる人ですよね?
可哀想です >>548
最初は1を主張する馬鹿を論破するだけで、2と3の区別なんて無かったんだけどなぁ…
2に対する3を定義しなおして信者信者言うのは論破された1が苦し紛れに言い出したかのような話題でなんていうかアレ。
そもそも2は全てdelete/freeも出来ない奴のスキルでは不可能だし、
メンテナンス性などの面から見ても必要があれば全て開放できる設計でないとダメ。
そもそも選択して開放しない方が良いなんて言うケースの方が例外的なのに、そんなの持ちだしてまで騒ぐなよ、と。
>>552
だよね。本来はその一言で終わる話題なのに・・・ ガベージコレクションはいらない、と必死でやせ我慢してC++を使う俺カッコイイ、というわけですねわかります
本来はこの一言で終わる話なのに、可哀想です >>554
> 必死でやせ我慢して
すまぽも知らない老害乙 >>554
GC はまだ「完成された」というほどの領域に至っていない、Mark&Sweep とか CopyGC, 世代別GC、incrementalGCなど、いろんな手法を駆使してだましだまし実装しているレベル
うそだと思うのなら、スマフォアプリを見ればよい、スマフォは定期的に再起動しないといけないレベル、iphone は定期的にiOSアップデートの方が先にやってくるようだが malloc/freeを確実に行う方法は完成している、とでも言うのかwwwwwwwwwww 研究が盛んなあらゆる分野に「まだ「完成された」というほどの領域に至っていない」って
喧嘩売ってみろよw >>558
簡単なラッパをかませばいいだけの話、それすらもできないの? いろんな手法を駆使してだましだまし漏れがないようにしているレベル、って言うんじゃないのか、それw それって言語レベルで完全なGC無いと満足できませんっていってないか? malloc/freeでバグばっかり出してる奴が「freeしない」という解決策を正当化しようとしているだけの話。 この感じだとバグ出す以前の問題で、deleteの使い方知らずに恥かいたJava厨なんじゃね? なぜメモリを動的に確保する必要があるのか?という基本に立ち返って考えれば
不要論は論外であることに気づくだろう
注:このスレタイからわかるように近年のGCは範疇に入っていない ■ このスレッドは過去ログ倉庫に格納されています