C言語CGIでfree()は必要?

[上に] [前に] [次に]
S-pore [HomePage] 1999/12/05(日) 09:45:03
はじめまして。
さっそくですが,C言語CGIについての質問をさせていただきます。

掲示板などのプログラムで,malloc()で確保した領域を
解放せずに(free()せずに)終了してしまうようなものを
WEBで公開してもいいものでしょうか?

もちろんそんなプログラムは,プログラム的に体裁が悪いわけですが,
free()する場合としない場合とでプログラミング労力が
かなり違う局面に出くわしてしまったので,
もしfree()しなくても実害がでないのであれば
そのほうがいいと思っているのです。

ほとんど(すべて?)のUNIXサーバーの場合,
プログラムが中断・終了すると,そのプログラムの使っていた領域が
自動的に解放されるはずですし,WinNTサーバーの場合も
おそらく同じだと思うので,問題ないでしょうか。

もしこれで問題が生じるようなら,
malloc()・free()を含む処理中にユーザーが
読み込み中止ボタンでプログラムの実行を中断した場合も,
(シグナル処理などで対処しない限り)問題が生じる可能性が
でてくることになると思いますが・・・。

それでは,よろしくお願いいたします。

P初心者 1999/12/05(日) 12:57:50
必要です!
使ったら、後片付けはしないと!

CGIでも自爆ルーチンが入っていないと、結構プロセスが残ります!
ですから、必ず free()をした方がいいです。

J.Naka 1999/12/05(日) 14:35:10
C言語のmalloc() free() は違いに連係してなくこれが致命的バグの温床であるとか、C言語仕様上の欠点だとからしいですね(とはどっか見た受け売りですが)
んで、UNIX上のC言語はどのようにそれを実装してるか知らないてのですが、mallco() free()をOSが管理するような実装ならば問題ないはずですが、、、どうなんでしょうか(^^;

それよりも、
>malloc()・free()を含む処理中にユーザーが
>読み込み中止ボタンでプログラムの実行を中断した場合も,
>(シグナル処理などで対処しない限り)問題が生じる可能性が
>でてくることになると思いますが・・・。
これは例外処理としてキチット実装してないと駄目すよね。OS側にある機能なのかユーザーアプリ側で実装しないといけないのかは別にして。というか、そのようなクリティカルな処理中は割り込み禁止なってないでしょうか?

とほほ 1999/12/05(日) 23:41:42
> もちろんそんなプログラムは,プログラム的に体裁が悪いわけですが,
私は、free()しないメモリを残したままプロセスを終了させることが
それほど体裁が悪いとは思っていない性質なのですが・・・

> CGIでも自爆ルーチンが入っていないと、結構プロセスが残ります!
> ですから、必ず free()をした方がいいです。
プロセスが終了する時は、OSが勝手にメモリを開放してくれます。
プロセスが残った時に、その消費メモリが少なくなるように、その都度、
その都度、不要なメモリをfree()することは意味があると思います。
しかし、終了直前にfree()するつもりであれば、それは必要無いです。

> これは例外処理としてキチット実装してないと駄目すよね。OS側にある機能なのかユ
> ーザーアプリ側で実装しないといけないのかは別にして。というか、そのようなクリティ
> カルな処理中は割り込み禁止なってないでしょうか?
例外処理を実装する必要が無ければ必要無いし、クリティカルでなけれ
ば割り込み禁止にしなくてもいいし・・・(^^;)

P初心者 1999/12/06(月) 10:43:41
>しかし、終了直前にfree()するつもりであれば、それは必要無いです。
同感です!

P初心者 1999/12/06(月) 11:11:07
>>しかし、終了直前にfree()するつもりであれば、それは必要無いです。
>同感です!

やはり、納得いかない!
malloc()でメモリ処理した後、不要になった時点でfree()すべきでしょ!
ですから、たまたま終了直前でもfree()したほがいいのでは...。
また、プログラムは第三者が後から追加変更することもあるし〜。
まぁ、...。

ワイルドカード 1999/12/06(月) 11:20:31
free()は特に必要ない・・・とは思います。
でも、ソースの公開を目的とするなら、清く正しく美しいプログラムにするのが当然の義務と考えます。

Selly 1999/12/06(月) 12:05:05
自アプリ内で確保したメモリである以上、自アプリ内で解放するべきでしょう。
#プロセス終了時にOSが勝手に解放してくれたとしても。

> でも、ソースの公開を目的とするなら、清く正しく美しいプログラムにするのが当然の義務と考えます。

公開・非公開に関わらず、きれいなソースが書けるかどうかがプログラマの能力の差だと私は考えています。

#そう考えると私は全然ダメ(死
#自分のソースでも読めなかったりするからなぁ・・・

ばかぼん 1999/12/06(月) 12:43:08
CGIですんで、何十、何百と同時に動くことも考えて、わたしの場合
必ずフリーしてます。
まー、データベースがらみの大きなデータを扱うからですけどね。
それも、仕事ですから念には念をいれて。

殿下 1999/12/06(月) 15:45:50
こんにちは。
C初心者ですが、「改訂新C言語入門」という本に、メモリを最後まで使うならFreeは不要と書いてあったので、そういうものだと思っていました。
ちなみに、だからどうと言うわけではないのですが、この本はベストセラーらしいです(^^)。
実に分かりやすい本で傑作だと思うので、Freeの件も信じてきってます。
ではでは。

とほほ 1999/12/07(火) 00:11:40
UNIXでは、一度malloc()した領域はfree()しても、そのプロセスが終
了するまでは、他のプロセスで利用できなかったように思います。

プロセスが消費するメモリは、その時点でのmalloc()されているバイト
数ではなく、それまでに最も多くmalloc()したバイト数に依存します。
詳細はbrk()システムコールと、LinuxやFreeBSDのmalloc()の実装を
参照してください。

Windowsでの実装は確認していませんが、プロセス終了時の開放処理は
一括で完了するのに対して、終了前にひとつひとつfree()するのは、
一括でできることを効率悪く行っているにすぎないのではないでしょうか。

という訳で・・・

プログラムの中盤でのfree()はやった方がよいです。これは、UNIXで
プロセスの最大使用メモリを減らすという意味からも効果的です。

プログラム終了直前のfree()はやっても無駄です。無駄な処理を行う
のと、無駄でもfree()するのはどちらが美しいかは人それぞれなので、
後者の美しさをとる場合もあるとは思いますが・・・私は前者の美しさ
をとっています。

J.Naka 1999/12/07(火) 01:21:28
なるほど、現場の技ですね。
、、、素人考えでぇ(^^;、実際の効率良いfree()のタイミングは最終デバッグでメモリ消費追跡ツールなんかで見るとカッコイイすね。
ぐっふふふ完成じゃ。 とか(^^;

P初心者 1999/12/07(火) 08:41:41
納得できました!
結論としては、
プログラム終了直前のfree()はその人の自由。(識者派はしない、初心者派はする)
これ以外はfree()する。

常駐プログラマーとしてはfree()とclose()は感じやすくて..。
あと、今はマシンへの配慮よりプログラマーへの配慮がのほうが...。
(ちょっと、負け惜しみ〜)

S-pore 1999/12/10(金) 08:39:24
[[解決]]
いろいろと分かりやすい説明をありがとうございました。
とりあえずプログラム終了直前ならfree()しなくても
害はないようなので,free()しない方向でやっていきたいと思います。

[上に] [前に] [次に]