C言語関係掲示板

過去ログ

No.1055 子プロセス終了時にfree()を記述するべきかどうか

[戻る] [ホームページ]
No.13737

malloc()してその後にfork()…
投稿者---開発者C級(2004/04/25 05:46:25)


プログラム中に取得したデータ件数分malloc()で領域を確保し、
その領域にデータを格納しておいて、その後fork()で子プロセスを作り、
それぞれの子プロセスは格納しておいたデータを参照して…
…などという感じのプログラムを作っております。

疑問なのは子プロセス終了時にfree()を記述するべきかどうかです。
親プロセスにのみfree()を記述すれば十分なのでしょうか?

例えば記述した場合、子プロセス,freeした所為で
子プロセス△参照するべきデータが何かの処理に上書きされてしまう、
なんてことが心配です。
例えば記述しなかった場合、なんらかの異常が発生した時に
領域を借りっぱなしの子プロセスデーモンができちゃったりしてしまう、
なんてことが心配です。

ちなみに開発環境はLinuxです。どうすればよいか知恵をかしてください!


No.13739

Re:malloc()してその後にfork()…
投稿者---かずま(2004/04/25 11:54:29)


> 疑問なのは子プロセス終了時にfree()を記述するべきかどうかです。
> 親プロセスにのみfree()を記述すれば十分なのでしょうか?

free の実行の有無にかかわらず、プロセスが終了すると、そのプロセスに
割り当てられていたメモリはすべてシステムに回収されます。

C の規格書には、「free 関数は、ptrが指す領域を解放し、その後の割付け
に使用できるようにする。」と書かれています。すなわち、free は、次に
malloc をするために有用であるというだけのことです。


> 例えば記述した場合、子プロセス,freeした所為で
> 子プロセス△参照するべきデータが何かの処理に上書きされてしまう、
> なんてことが心配です。

プロセスはスレッドと違って、メモリ空間を共有しませんから、そんな心配は
不要です。


> 例えば記述しなかった場合、なんらかの異常が発生した時に
> 領域を借りっぱなしの子プロセスデーモンができちゃったりしてしまう、
> なんてことが心配です。

free を記述しても、その free が実行される前に異常が発生し、プロセスが
終了せずデーモンになったら、free を記述しないのと同じですね。


No.13751

Re:malloc()してその後にfork()…
投稿者---開発者C級(2004/04/25 18:28:06)


早速の御回答ありがとうございました。
ご助言を踏まえて熟慮し、記述するかどうか決めたいと思います。
(多分記述しないと思います。)

>プロセスはスレッドと違って、メモリ空間を共有しませんから、そんな心配は
>不要です。

上記について疑問があるのですが、例えばfork()を実行した後、
それぞれの子プロセスが前にmalloc()で得ていた領域のアドレスを
標準出力させると、全部同じ値を表示します。
でもこれはアドレス値が一緒でもメモリ空間は一緒じゃない…
ということになるのでしょうか?


No.13752

Re:malloc()してその後にfork()…
投稿者---ぽこ(2004/04/25 18:35:44)


>上記について疑問があるのですが、例えばfork()を実行した後、
>それぞれの子プロセスが前にmalloc()で得ていた領域のアドレスを
>標準出力させると、全部同じ値を表示します。
>でもこれはアドレス値が一緒でもメモリ空間は一緒じゃない…
>ということになるのでしょうか?

その通りだと思います。
指しているアドレス(仮想アドレス)の値は同じでも、
子プロセスAは子プロセスAのメモリ空間、子プロセスBは
子プロセスBのメモリ空間を持っているので、実際に指している
アドレス(物理アドレス)は違います。


No.13763

Re:malloc()してその後にfork()…
投稿者---開発者C級(2004/04/26 01:18:46)


わかりやすい御説明ありがとうございます!本当に勉強になりました。
また何かのときはよろしくお願いします!