mallocとfree

このエントリーをはてなブックマークに追加
1fj嫌い
fj.comp.lang.cなどで話されている「mallocとfree」の内容に対する
感想や考えを述べるスレッドです。

fjで話されている「mallocとfree」というのは、要約すると
「mallocで確保した領域は終了時に自動的に開放される(らしい)のだから
よほどの事情がない限りfreeする意味が無いのではないか?」
ということを話し合っていました。(違うようでしたら補足をお願いします)

私としては「freeしたくない」人がいろいろ理屈をこねてるだけ
のような気がしてならないのですが・・・
2free好き:2000/03/20(月) 03:47
書いてるコードの性質にもよるだろうけど...
20時間ぐらい走って それからメモリ不足で落ちるのは勘弁して
3名無しさん:2000/03/20(月) 03:57
free しないとどんどん使用可能メモリ減っちゃういそうです
スワップファイルが大きくなるのもいやだし
クラスの定義でオブジェクトが free しないのは
なんか嫌な感じがしますが・・ってこれはC++の話ですね
4名無しさん:2000/03/20(月) 04:06
関係ないことで申し訳無いんですが、fjの過去記事って、
どこにあるんですか?
51:2000/03/20(月) 04:37
gooで検索したら過去記事を保存している所がありました。

mallocとfreeのスレッドは

http://news.dinf.ne.jp/news/fj/comp/lang/c++/thrd6.html
から
http://news.dinf.ne.jp/news/fj/comp/lang/c++/thrd23.html

まであるようです。かなり長いです(^^;
61:2000/03/20(月) 04:45
http://news.dinf.ne.jp/news/fj/comp/lang/c++/thrd5.html#00243

すみません、ここにもありました。けれど、大元の記事は見つけることができませんでした。
7なんだか:2000/03/20(月) 05:01
使わないなら、なんのために free があるのって思うけど・・
静的配列も解放とか、わけわかんない意見もあるし
実装と論理を混同してる気がする。
OSを記述することもできる言語に
OSが処理することを前提とした処理をさせるのは
ナンセンスのような。
84>5:2000/03/20(月) 05:08
サンキュー。参考にします。
97:2000/03/20(月) 05:12
すまん、わかりづらいな。
タスク終了時にOSがメモリを解放するとは限らないのに
解放してくれるという、処理系依存な前提で書くのは
ナンセンスでは、ということです。
10同感 > 7=9:2000/03/20(月) 05:40
mallocしたものはfreeする でいいじゃないの。

mallocがどっからメモリを割り当てるかなんて、知ったこっちゃない(=依存すべきでない)し
freeがどこにメモリを返すかなんて、これまた知ったこっちゃない。

malloc/freeを使う人が知るべきことは、どこからともなくメモリが割り当てられて、使い終わったら返す、ということ。
以上 おしまい。行儀よくできたらいい子いい子。
11名無しさん:2000/03/20(月) 17:58
age
12>1:2000/03/20(月) 18:26
fj で話されているんだから、fj に行け。

もともと
-------------------
C言語の本をにはたいてい
mallocしたメモリーをもう使わないなら放っておけば
終了時に自動的に解放されるので明示的にfreeしなくても良い
と書いてあるのですが、先日ある雑誌を見ると
明示的にfreeしないとメモリーリークになる
と書かれていました。どちらが正しいのでしょうか。
-------------------
って書き込みがあって、「いやそんなことはない。Free すべきだ」
「環境によってはほっておいても良いよ」って話が続いているだけ。

元々の「free をしなくてもよい」と書かれた文献に関しては
元質問者は返答なし。たぶんびびって逃げたんだろう。

13java使い:2000/03/20(月) 21:05
不毛な議論だ
14>13:2000/03/20(月) 22:26
弱点:ガーベッジコレクション
15でもさ:2000/03/21(火) 01:54
なんでOS側がプログラム終了時点ですべてのリソースを解放出来ないの?
 なにが難しいの?(自分なら簡単にできる!って意味じゃないです)
OS組んだことがある人 or 詳しい人。教えて!
16名無しさん:2000/03/21(火) 02:08
一応C/C++にもガベージコレクターライブラリってのがあるよ。
w3mくらいしか実用例を見たことがないけど・・・
あと、Apacheのモジュール作成ライブラリにはプールというそれに近い(のか?)
概念がある。
17ぷろぐらま:2000/03/21(火) 02:09
>15
開放したく無い時ってのもあるでしょ?
18> 14:2000/03/21(火) 02:53
弱点というよりは特徴なんだろうな。>GC
長所と短所があるからね。
199:2000/03/21(火) 02:54
>15
Cの実行環境はOSが必須ってわけじゃないし
あえて定義してないのかもしれない
malloc/free で一歩踏み込んでそこまで定義すると
OSの仕様を限定することになりますから。
それはCの仕事ではない、と。
20AO:2000/03/21(火) 07:04
仮にOSが完全なリソースの開放を保証したとしても、
第三者がそのソースコードを見た場合、freeを書かなかったのか、
freeを書き忘れたのか、よほど単純なプログラムじゃない限り、
調べることにかなり労力が必要ですね。。。freeを書くべきでしょう。。。
21名無しさん:2000/03/21(火) 07:33
とりあえず、C++に移行してmalloc()を使用しないようにしましょう。
221:2000/03/21(火) 08:23
23名無しさん:2000/03/21(火) 08:56
>22
サンキュー。勉強になるなぁ。
2415:2000/03/21(火) 09:49
17&19 さんきゅ。

でも、なんかの本で確かに「OSがプログラム終了時点で解放してくれる」
ってのを読んだんだが、、、あれは嘘ってことだよね?
 ちなみにfreeはしっかり書く派です。
25> 24:2000/03/21(火) 10:15
PCの"普通の環境や状況"では、プロセスが終了するときに、そのプロセス用に確保されたメモリは解放されるよ。
「例外なく」「言語で規定されている」というのは間違いだけど。

1さんが紹介している、http://member.nifty.ne.jp/maebashi/programmer/c_yota/malloc.html
の、Storageによる破棄と、似たようなことが、プロセスが終了するときにおこると思うといいのかもしれない。

でも、malloc/freeとは直接関係ないような。
26名無しさん:2000/03/21(火) 10:20
「グラフの破棄がめんどさいよぉ。」って気持ちなんだろうな。きっと。
でもって、そこまで苦労して、破棄してどうするの。とか。

または、プロファイラで調べたら、データ構造の生成に30%処理に50%
データ構造の破棄に20%もかけてるぞぉ...
どうせ、プログラムは終了するんだから、データ構造なんか破棄しなくてもいいよね??
とか、そんな気持ちなのかな。
27陰陽:2000/03/21(火) 10:42
何度も呼ばれる関数とか何度もインスタンス化→破棄を繰り返す
クラスとか作ること無いんでしょ。

それなりのクラス設計するようになったらfreeを終了時に
やってもらえばいいなんて発想は無くなると思うけど。
28JAVA使い:2000/03/21(火) 11:02
JAVA House MLでJAVAでガーベッジコレクションを自動的にやらせ
ずに明示的に malloc と free ができないかという議論があったな。
29> 28:2000/03/21(火) 11:22
finalizeのタイミングを制御したいってこと ?
30JAVA使い:2000/03/21(火) 11:50
予期しないタイミングでガーベッジコレクションされて、
ガーベッジコレクション中の他の処理が遅くなって困ると
いうような事だったと思います。解決策は、system.gc()
を事前にやっておくということだった思う。
3129:2000/03/21(火) 12:07
> system.gc()を事前にしておく
もっともな意見だ。
でも、当たり前過ぎて、ちょっと残念。
32名無しさん:2000/03/22(水) 16:13
あげ
33つーか:2000/03/23(木) 00:13
openしたらcloseする
allocしたらfreeする
当然のことじゃん?
34名無しさん:2000/03/23(木) 00:50
free_all()みたいなことができたら便利かもね。
ツリーを破壊するときなんかは...
35>34:2000/03/23(木) 07:58
ツリーって普通親を殺したら子も道連れになるように作らない?
36名無しさん:2000/03/23(木) 08:43
sorry@` my front end processor has wrong.
so@` where is gabage collection library on internet?
someone plz tell me the url to get it.
3735>36:2000/03/23(木) 08:56
ガーベージコレクションの話じゃなくて、ツリー構造の親のデストラクタ内部で
ツリーにぶら下がっている全部の子のデストラクタを呼ぶように作るという事です

ガーベージコレクションの技術的な内容については Perl本とかで実際にインタプリタ
でどう実装されているかの例が覗けますよ
3835:2000/03/23(木) 08:58
いやルビー本だったか
39壊れプログラマ〜:2000/03/23(木) 12:29
 freeしなくてもいいなんていってる連中は、
その程度のプログラムしか作ったこのがないレベルなので、
無視して構いません。
4034:2000/03/23(木) 14:02
木は普通子連れで壊しますね〜。
DAGや辺リスト表現のグラフなんかは、ちょっとめんどくさいよう
な。あんまり必然性はないけど。
サイクリックな参照をする、データ構造だと、参照カウンタを
使った単純なテクニックだと、中ぶらりんになるのが気持ち悪い。
#もちろん free()不要論者の方には関係ない話でしょうが。
楽してそこそこの効果を狙うとなると、自分でmark&sweep法
のGCを作ることなのかなぁ。
41名無しさん:2000/03/23(木) 14:36
>サイクリックな参照をする、データ構造だと
あんまりややこしい時は推移論包だから
ね、n-aryや有効グラフは使わないなぁ。
事例にちょっと関心がでてきたな。
有効グラフを使ったソースとしてはGNUflex
だな。とりあえず。
42>40:2000/03/24(金) 08:31
43名無しさん:2000/03/24(金) 12:20
Boehmは回収し損ねるとあるわけだから、実験的な物。
使うとすれば登録の関数を持つ「コーノ」式か
「プール内アロック」だろうね。
後者は作ってみたけど結局使う機会がない。配布しようかな。
44名無しさん:2000/03/24(金) 12:42
関数内ローカルなオブジェクトだけでも自動的に廃棄してくれると助かる。
C++ならそれが可能だが、Delphiはそれが出来ないのが不満。
Try...finalyをいちいち使わなければならない

45おばかさん:2000/03/24(金) 14:20
C++でコンストラクタ内で例外が起こったとき、そのオブジェクトの
デストラクタが呼ばれないというのを最近まで気づかなかった。
46>43
お願いしますm(_ _)m