mallocの後にfree不要と言うバカいるの?Part2

■ このスレッドは過去ログ倉庫に格納されています
2013/01/30(水) 21:38:37.44
fjの時代から10年以上に渡るmalloc/free問題について語ってください(^q^)

前スレ
main以外★mallocの後にfree不要と言うバカいるの?
http://toro.2ch.net/test/read.cgi/tech/1352812333/
2014/10/13(月) 21:23:47.22ID:QgIQdsn/
>>476
問題になってるかどうかはどうでもよくね?

1ナノ秒でも1ミリ秒でも速いほうがいいだろう?
速くなることにメリットはあれどデメリットはない。
2014/10/13(月) 21:31:35.61ID:7i+sJhXA
>>478
小手先の最適化をバンバンやれと言う主張ですね
まあ、頑張ってくださいな w
2014/10/13(月) 21:47:30.33ID:QgIQdsn/
>>479
ちりも積もれば山となるってことわざ知らないの?

1ナノ秒でも積もれば1時間になるんだけど。
481472
垢版 |
2014/10/13(月) 21:54:16.26ID:XfBY1GST
>>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もグローバル変数だったりするのかね?

あくまで、例のための例ですが、グローバルなときもあります。
# というか、そのほうがすっきりする。
2014/10/13(月) 21:57:14.67ID:7i+sJhXA
>>480
> ちりも積もれば山となるってことわざ知らないの?

知ってる。
だから、小手先の最適化なんてしないんだよ。
速さより、重要なことってあるんだよ。
2014/10/13(月) 22:05:33.55ID:QgIQdsn/
速さよりも重要な事なんて無いよ。
金さえあればスパコンがほしいぐらい。
2014/10/13(月) 22:09:28.23ID:Okyxmr/t
そーゆーレベルだとアルゴリズム工夫した方が早くならね?
2014/10/13(月) 22:15:14.16ID:6bh+5rPK
>>483
それは、正確さだなw
あと脆弱性への強さ。
コードの見通しのよさ、コードの柔軟さ。

速さがどーしても欲しいってのはリアルタイムOSとかそういう分野なのかなぁ?
2014/10/13(月) 22:17:23.60ID:Okyxmr/t
>>483
マルチスレッド使っての高速化とかは無理?
2014/10/13(月) 23:38:21.18ID:7i+sJhXA
>>483 は素早く間違った結果が欲しいんだろう w
2014/10/13(月) 23:41:05.25ID:xQhnOcQ3
>>470
いや、俺はお前みたいな馬鹿じゃないぞ
2014/10/13(月) 23:41:20.11ID:7i+sJhXA
>>485
> 速さがどーしても欲しいってのはリアルタイムOSとかそういう分野なのかなぁ?

そういう分野は、速さと言うよりどんな場合でも決められた時間に間に合うこと(つまり、遅くならないこと)を要求される
ハードリアルアイム でググってみそ
2014/10/13(月) 23:42:12.91ID:2IfdctYm
freeが必要だと思う人はしていただき、その必要性はないと思う人はしない
ということで各々ご対応をお願い致します。

それでは、ここらでお開きとさせていただきます。

皆様、活発な意見交換、誠にお疲れ様でございました。
2014/10/13(月) 23:50:17.84ID:7i+sJhXA
>>490
>>379
2014/10/14(火) 00:04:57.97ID:Q5F/7GsC
>>491
おまえ、まだいたのかwwww
2014/10/14(火) 00:16:00.24ID:sqIDnjxe
>>492
チキン君乙
2014/10/14(火) 00:17:04.09ID:Q5F/7GsC
よく吠えるやつほど弱いのはどこでも同じだな
495デフォルトの名無しさん
垢版 |
2014/10/14(火) 01:48:42.60ID:QI+gLDOE
>>475
わからないから、教えて下さいだろ。池沼。
2014/10/14(火) 06:32:50.32ID:zT0VwE4n
>>403
ネタ主張を1400レスも続けるとかヒッデェなぁ…
2014/10/14(火) 06:34:31.53ID:sqIDnjxe
>>494
うんうん、そうだねー
で、説明は? w
498デフォルトの名無しさん
垢版 |
2014/10/14(火) 07:21:14.97ID:VoeXlFKz
この問題の根は、ファイル名に日本語を使うべきでないや、メールタイトルに
日本語を使うべきでない、と同じです。

こういった問題について議論すると、必ず日本語を使うべきでないという結論に落ち着く。
しかし、本当の答えは、日本語が使えるべきです。

RAIIは多くの問題を論理的に解消できるので、常に使えるようにするべきです。

LinuxでRAIIが問題を引き起こすことは良く知られています。
メモリーの開放に時間がかかるので、メモリーの明示的開放を避けるべきという議論も
その一つです。
しかし、本当の答えは、Linuxでもメモリーの開放に時間がかからないようにすることです。
RAIIを避けるべきという議論は、過去に繰り返された日本語を使うべきでないという議論と同じです。
2014/10/14(火) 08:43:00.85ID:rLZatyKU
Linux以外なら、細かく何度もmallocして、しかもスワップアウトした領域を
freeして回っても遅く無いってか?馬鹿じゃないの?
2014/10/14(火) 08:49:08.26ID:KA+Nt7Wt
先に大きめの領域確保して、開放すれば
細かく領域するときの速度が上げれるかもね
なんででしょうね?
2014/10/14(火) 08:50:02.00ID:KA+Nt7Wt
☓細かく領域するとき
○細かく領域確保するとき
502デフォルトの名無しさん
垢版 |
2014/10/14(火) 09:05:57.25ID:VoeXlFKz
>>499
その問題の原因は、確保したメモリー領域の先頭に大きさなどの情報を持たせることです。
どれだけの大きさを開放するか調べるために遅い二次記憶から情報を復元します。

ですから、仮想記憶が一般的になると、多くのランタイムライブラリがメモリー管理を
OSに任せるようになりました。
メモリーの開放が直接OSによって処理されることで、OSは二次記憶から情報を取り出さずに
解放するタイミングを得ます。

残念ながらLinuxではそうなっていないため、メモリーを開放すると遅いので
解放するべきではないと主張する人が現れるようになりました。
2014/10/14(火) 09:58:22.05ID:9xoyfEkM
exitする直前にfreeしないのは、OSのメモリ管理機能を利用してるってことなんだけど?
2014/10/14(火) 10:05:00.55ID:FOfhE0DJ
てなしたやはたてやな
2014/10/14(火) 10:21:21.80ID:KA+Nt7Wt
長文の割にワケワカなこと書いて漫画な
506デフォルトの名無しさん
垢版 |
2014/10/15(水) 20:16:19.78ID:94xVsGz9
>>503
バカ発見。
2014/10/15(水) 20:25:23.13ID:hrBmyTxM
自己紹介乙
2014/10/16(木) 04:07:06.14ID:7g6vpmsm
>>502
>ですから、仮想記憶が一般的になると、多くのランタイムライブラリがメモリー管理を
>OSに任せるようになりました。
>メモリーの開放が直接OSによって処理されることで、OSは二次記憶から情報を取り出さずに
>解放するタイミングを得ます。
そんな非効率的なことをやってる環境があるの?
2014/10/16(木) 06:57:35.08ID:KoQGXxiO
VCのmallocはHeapAllocに丸投げする場合があるようだが、一般的かっていうと…
2014/10/17(金) 09:39:29.66ID:O3Ha9Xaq
何を非効率と言いたいか知らないが、アプリがfreeしまくればメモリアクセスは当然発生する。

サクッと終了しちゃえば、OSはそのアプリに割り当ててたページをそのまま割り当て解除して
回収するだけ。

この効率の差を理解できないか、OSというものを理解してない発言でしかないわけだがwwwww
2014/10/17(金) 16:14:49.18ID:v27NSYq1
>>510
で、その効率の差が実感できるアプリケーションってなに?
心のよりどころの cp だけ? w
2014/10/17(金) 16:21:12.12ID:qPP0na7I
アプリ終了以外では
ある程度の大きさ以外は、freeしても割り当て解除はされませんよ
だから、ヘタすると、メモリ分断が怒って....
2014/10/17(金) 17:45:37.94ID:O3Ha9Xaq
>>511 メモリを大量に確保するアプリならどれにでもあてはまる、
ということすら理解できないのかw
2014/10/17(金) 18:16:31.32ID:P1joaUul
>>513
> >>511 メモリを大量に確保するアプリならどれにでもあてはまる、

メモリの確保の仕方によって全然違うことも理解できないアホ乙
2014/10/17(金) 18:16:40.65ID:xzFrNjz5
>>510
>>502の言うようにOSにメモリ確保を丸投げしてる場合、APIによってはOSも参照カウントの操作・確認も行うかもしれんぞ?
(例えば、WinのCreateFileMappingで確保したページファイル領域は生きたハンドル(を持つプロセス)があれば残る)
解放をOSに任せることで確実に軽減できるのは、アプリ側が解放すべきハンドルやポインタを走査するコストだけ。
その他のコストは実装依存でどのくらい軽減できるかが異なる。
…けど、これが問題になるケースも実装もそう多くないだろうからなぁ…

>>513
メモリ管理情報の操作に時間がかかってるんだから、小さい領域を山のように確保してるアプリじゃないか?
ポインタの走査にも時間がかかりやすい構造(馬鹿正直なリンクリストなど)だとよりコストが増える。
2014/10/17(金) 19:39:54.06ID:lxCKNdJC
HeapAllocはプロセス内で確保したメモリを小分けして管理してるだけで、
それをOSの機能の一部みたいに扱うのはなんかモニョるな。
2014/10/17(金) 20:22:20.74ID:OUYn97Bj
>>511
お前がひねり出したうんこプログラム全部
2014/10/17(金) 21:53:10.77ID:xzFrNjz5
>>516
言いたいことは分かるがWin32APIって案外そういうの多いからなぁ…
user32とかkernel32にも標準CライブラリみたいなAPI(sprintfモドキも居るしw)が結構一杯ある。
MulDivやCopyMemoryみたいなのも居るし、CopyRectに至ってはただの32バイトコピー。
HeapAlloc程度でモニョってたらこいつらはモニョるなんてレベルじゃすまんぞw
MulDiv(32ビット値3つから中間値64ビットの掛け算と割り算)が何故カーネル扱いなのかと。
2014/10/18(土) 01:39:31.35ID:/oNwCDSd
>>510
つスレッドタイトル
2014/10/18(土) 13:08:53.33ID:36yYJ0yX
>>510
昔はそんなにメモリが潤沢になかったから、アプリが終了する前でも
不要になったら開放する方が、いろいろとよかった時代もあったんだよ

>>all
もうお前ら不毛だからこの辺にしとけ
2014/10/18(土) 13:50:57.61ID:/oNwCDSd
>>520
そうもいかない、そんな結論では C++ がいまだに営々と複雑化にこだわっている立つ瀬がない‥
2014/10/18(土) 16:59:54.98ID:36yYJ0yX
メモリは動的に確保するくせに開放は静的にOSに任せたい
だったら、必要になるであろうメモリも配列で静的に確保しとけばいいんじゃね?
とか思うんだが…

でこういうこと言うと荒れるから、結論は
freeしたい人はして、したくない人はしない
で終了でいいんじゃね?っていう
2014/10/18(土) 17:06:19.18ID:/oNwCDSd
>>522
それは古来lispでもよくみられたプール式、cons セルという定サイズ領域を多量に使う用途で採用されているのをみたことがある
2014/10/19(日) 18:09:53.15ID:9/KRJRbT
解放しないプロセスってデバッガで実行すると終了時に大量のleak検出を吐き出したりしないのか?
2014/10/20(月) 02:00:02.18ID:jjiQL4kf
吐いたとしても意図的に吐かせてるつもりだろうから問題ないんだろ
2014/10/20(月) 12:45:42.29ID:4QGk34Ml
たぶんメモリリークしてもプロセス終了時に
全部解放されるんだから大丈夫だと思ってるんじゃない?
2014/10/20(月) 12:49:49.79ID:6/LNQkyp
リソースリークとメモリリークの区別もできないとかが典型例だな
2014/10/20(月) 19:41:25.28ID:WDflShpF
リークと解放の区別が付かないバカは死ねば良いと思う。
2014/10/20(月) 19:48:59.73ID:+DF5oC/s
メモリリーク検出ツールでリークと解放の
区別がつかなくなるから解放しとけって話でしょw
2014/10/20(月) 23:06:26.87ID:exxFMbgq
プログラム中で確保したメモリの各々がfreeする必要あるかないか、間違えずに
判断できる達人ならリークチェッカ使う必要ないな。
2014/10/21(火) 12:31:58.89ID:LAOYaiit
>>530を省略すると、

ミスをしない人はリークチェッカはいらない。

ということ。
2014/10/21(火) 12:58:58.48ID:cxE2fch2
要約?
2014/10/21(火) 13:01:27.03ID:FB8PDZ29
普通にできないといけないことではないかと
2014/10/21(火) 13:25:02.74ID:LAOYaiit
リークチェッカなんて必要ない。
作った奴は馬鹿だ。
ミスをしなければいいだけの話。
2014/10/21(火) 13:49:27.95ID:FB8PDZ29
ミスしてもいいのでは、修正できれば
いきなり完成品?作れる人いるのけ
2014/10/21(火) 17:55:34.62ID:RumsGmel
デバッグモードでコンパイルしたときだけ解放したら
良いだけじゃん馬鹿すぎ
2014/10/21(火) 18:51:18.50ID:LAOYaiit
>>535
その修正をサポートするルールがリークチェッカでしょ?

で、free不要なんていって、free書いてないから
たくさん出るエラーの中から本当にリークしているものを
探して出すというマヌケな作業を行うwww

結論出たじゃん? freeは必要。
2014/10/21(火) 19:58:14.89ID:FB8PDZ29
便利な道具がある。
とかいうとわからないでも出来ると勘違い...
2014/10/21(火) 20:16:00.88ID:7WAeJlTS
なんでfree関数というものがあるのかを考えればわかるよな
もう終わりだろ…
2014/10/21(火) 21:03:35.69ID:c8NUu7RB
意図的にfree省略してる場合は>>536で済むってのは置いといても、
>>534ではリークチェッカ自体が不要と言っているのに、
>>537ではリークチェッカの為にfreeが必要って変な結論だなぁ…
2014/10/21(火) 21:34:25.75ID:FB8PDZ29
リークチェッカのエラーをなくすことが答えだと思ってる人もいますね
微妙な...
2014/10/21(火) 22:04:40.05ID:RG7X7O+y
リークチェッカーでリークを葬ったら、おもむろに選別していけば言いだけの話
というか、リソースリークの方が深刻でちょっと困っている
2014/10/22(水) 21:25:19.20ID:9Jwqj8Ni
おもむろに選別する効果・・・0.001秒速くなる。
デメリット、選別作業に数時間。
ドラブルあって、戻すのに数時間
2014/10/23(木) 01:07:59.70ID:lumgeE3v
>>542
リソースの確保・開放処理をリークチェッカと同じ仕組でラップしよう。
2014/10/23(木) 08:36:30.18ID:CIjfK2M+
>>544
api の数だけラップを用意するのもなんだかね‥
546デフォルトの名無しさん
垢版 |
2014/12/03(水) 21:28:00.02ID:j0dAKNGZ
C++だと、動的確保って

int *a = new int;

/*
aを使った処理
*/

delete a;

みたく書くと思うけど、deleteしないとアプリケーションを終了させても
確保されっぱなしだよね?
free()不要とか言ってるやつは、上記でいうdelete不要って言ってるのと
同じだよね?
2014/12/03(水) 21:41:48.53ID:JFY2u8h+
newは互換性のためにmallocで実装されてると聞いたことがある。ほんとか知らんけど。
2014/12/03(水) 22:01:51.69ID:U2a4HdIu
>>546
>deleteしないとアプリケーションを終了させても確保されっぱなしだよね?
いや、それはない。アプリ終了時にアプリの使用していたメモリは OS が解放する。これは基本的な共通認識。
それをみこして free()/delete を@まったくしないでもいい、A選別して使用しないのもありだ、B信者ならどんな new/malloc() も必ず delete/free() すべきだ、真っ向に対立している。
2014/12/03(水) 22:25:43.16ID:JF624AUp
B選別するほうが面倒くさいだろう
2014/12/04(木) 02:18:35.19ID:wOy+480c
C++なら、メモリマネージメントクラス書くでしょ。その前にstd::vectorあるけど。
2014/12/04(木) 04:20:29.25ID:ViSTblTx
Jane使ってる人は分かると思うけど、一度に多量の画像を保存する機会が多いと思う
そしてJaneは一度立ち上げたらOS再起動するまで大抵立ち上げっぱなし

そんな状態で画像の展開領域のためにmalloc()もしくはnewしたメモリをfree()やdelete
しなかったらどうなる?これ32bitアプリでしょ?120〜150枚ほど画像を開くと、例えば俺の
環境の場合Windows8.1だからJaneには2GB割り当あられるけど、free()しないとすぐに
メモリがなくなっちゃうね
2014/12/04(木) 07:46:58.88ID:44/e6+B9
delete/free()不要って言ってる人って、もはやなぜメモリを動的に確保するのか?
の意味を見失ってる人ですよね?
可哀想です
2014/12/04(木) 08:53:33.85ID:i8WWsgkD
>>548
最初は1を主張する馬鹿を論破するだけで、2と3の区別なんて無かったんだけどなぁ…
2に対する3を定義しなおして信者信者言うのは論破された1が苦し紛れに言い出したかのような話題でなんていうかアレ。

そもそも2は全てdelete/freeも出来ない奴のスキルでは不可能だし、
メンテナンス性などの面から見ても必要があれば全て開放できる設計でないとダメ。
そもそも選択して開放しない方が良いなんて言うケースの方が例外的なのに、そんなの持ちだしてまで騒ぐなよ、と。

>>552
だよね。本来はその一言で終わる話題なのに・・・
2014/12/04(木) 09:15:31.23ID:otxDKoZc
ガベージコレクションはいらない、と必死でやせ我慢してC++を使う俺カッコイイ、というわけですねわかります
本来はこの一言で終わる話なのに、可哀想です
2014/12/04(木) 12:56:10.33ID:hhBXBLyI
>>554
> 必死でやせ我慢して

すまぽも知らない老害乙
2014/12/04(木) 18:22:41.52ID:jHjIGczB
なまぽおいしいです
2014/12/04(木) 20:36:19.32ID:e632zg1P
>>554
GC はまだ「完成された」というほどの領域に至っていない、Mark&Sweep とか CopyGC, 世代別GC、incrementalGCなど、いろんな手法を駆使してだましだまし実装しているレベル
うそだと思うのなら、スマフォアプリを見ればよい、スマフォは定期的に再起動しないといけないレベル、iphone は定期的にiOSアップデートの方が先にやってくるようだが
2014/12/04(木) 20:49:21.59ID:otxDKoZc
malloc/freeを確実に行う方法は完成している、とでも言うのかwwwwwwwwwww
2014/12/04(木) 20:50:13.03ID:otxDKoZc
研究が盛んなあらゆる分野に「まだ「完成された」というほどの領域に至っていない」って
喧嘩売ってみろよw
2014/12/04(木) 21:03:43.58ID:e632zg1P
>>558
簡単なラッパをかませばいいだけの話、それすらもできないの?
2014/12/04(木) 21:25:34.66ID:otxDKoZc
いろんな手法を駆使してだましだまし漏れがないようにしているレベル、って言うんじゃないのか、それw
2014/12/04(木) 22:34:16.24ID:wOy+480c
それって言語レベルで完全なGC無いと満足できませんっていってないか?
2014/12/04(木) 23:15:24.98ID:Q4EOsLJ8
malloc/freeでバグばっかり出してる奴が「freeしない」という解決策を正当化しようとしているだけの話。
2014/12/05(金) 00:48:52.11ID:3wjXi0Au
この感じだとバグ出す以前の問題で、deleteの使い方知らずに恥かいたJava厨なんじゃね?
2014/12/05(金) 01:39:25.94ID:eQEw8fvn
なぜメモリを動的に確保する必要があるのか?という基本に立ち返って考えれば
不要論は論外であることに気づくだろう
注:このスレタイからわかるように近年のGCは範疇に入っていない
2014/12/05(金) 08:03:02.81ID:F2ZjRsjm
もともと GC の話じゃないし
2014/12/05(金) 08:19:12.35ID:2qqkLjHh
>>561
ラッパ一つを「いろんな」「駆使して」とかいうお子様レベルなの?
あと GC はまだまだだよ、Java の業務アプリを60日間起動しているとメモリ占有量が増えてきてきびきび動かなくなるとか勘弁してほしい、スマフォもイマイチだなあ
2014/12/05(金) 11:53:33.63ID:IjAdRY0C
ほら出た、「俺様のやってる業務には」というすごく狭い世界が、世界の全てだ、みたいな人w
2014/12/05(金) 20:02:26.00ID:2qqkLjHh
>>559
確かにFORTRAN, COBOL と並ぶ由緒正しき Lisp 様由来の GC に喧嘩を売るのはちょっと怖いが、実はすでに試みてみた‥
http://peace.2ch.net/test/read.cgi/tech/1408017352/201
2014/12/06(土) 00:13:17.80ID:tAcOC+EO
Qzって、Lisp Schemeでケンカ吹っかけてガン無視されてるよな。
2014/12/06(土) 00:28:28.87ID:uyZCaoW8
「胸を借りるつもりで」
2014/12/06(土) 01:08:13.40ID:uyZCaoW8
>>547
演算子 new をオーバーロードするとき、中身は malloc() で書かざるを得ない気がする‥
2014/12/06(土) 03:30:36.01ID:Iv1q4dyj
>>572
VirtualAllocとかOS依存のメソッド使ったり、グローバルな配列を細切れに使ったりも出来るんじゃない?
標準のAPIで書くならmallocしかないけど…
コンパイラ環境側が提供するnewを標準Cの範囲のみで書かなきゃダメな規則とか有るんだろうか?
だけどstd::threadとか標準Cにはどうやっても落とし込めないよなぁ…
2014/12/06(土) 09:58:48.26ID:Khx/zTiJ
いやいや、freeが邪魔になるのは数少ない例外って
世界でものすごく広く使われているプログラムcpがfreeが邪魔だから
最後のfreeしなくなったでしょ

Google word2vecだって最後のfreeは省略している。

上で書いてあるJaneの例はfreeすべき例、
オブジェクトの寿命が終わったのだから。


free絶対主義者の考え方の何が、気に食わないかって
オブジェクトの寿命を意識してプログラムを組んでいないんじゃ
ないかってこと。

リークチェッカに引っかからなければプログラムの実行中
不必要なオブジェクトの領域が確保されていても気にしなさそう。
2014/12/06(土) 11:47:15.03ID:dmb0kXdE
なぜメモリを静的にではなく動的に確保するのか?の本来の目的を考えれば
自ずと答えは出る
2014/12/06(土) 12:31:58.16ID:ui+tbMEF
オブジェクトの寿命を意識するってのは、プログラム開始してから終了するまでの
どの期間存在するかを常に意識しろということなのかね。
プログラムの構造化によって生存区間を限定し、不要になった時点で破棄することで
大域的な知識によらずに安全に使用リソースの最小化を図るという考え方が理解できない
原始時代の人なんだろうか。
そういう人は少なくとも関数内でmalloc/freeを使うべきじゃないな。
2014/12/06(土) 12:50:41.02ID:JydoFUaV
大域的な知識を基に最適化するのはむしろ今のトレンドだけど

オブジェクトの生存期間を意識し、場合によってはfreeしないことで
プログラムの性能を向上させる話でしょ?
cpやword2vecの例は
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況