C言語関係掲示板

過去ログ

No.258.自己参照構造体のfree


No.1547

自己参照構造体の章のmallocについて
投稿者---ジャスミン茶(2002/05/20 16:55:50)


mallocを使った場合は必ず自分でfree関数を使ってメモリを開放しなければならないとあるのですが、
自己参照構造体の章の例題では開放は行われていないようです。
ただ、自分の環境では特に問題は起こっていません。
もし、これを開放する場合は新規作成する度にその構造体変数へのポインタを配列(int型などのサイズの小さいもの)に格納して、プログラム終了時にforループなどで作成回数分だけfree関数で開放すればいいのでしょうか?
それとも開放する必要は無いのでしょうか?

No.1549

Re:自己参照構造体の章のmallocについて
投稿者---snow(2002/05/20 18:01:36)


>mallocを使った場合は必ず自分でfree関数を使ってメモリを開放しなければならないとあるのですが、
>自己参照構造体の章の例題では開放は行われていないようです。
>ただ、自分の環境では特に問題は起こっていません。
>もし、これを開放する場合は新規作成する度にその構造体変数へのポインタを配列(int型などのサイズの小さいもの)に格納して、プログラム終了時にforループなどで作成回数分だけfree関数で開放すればいいのでしょうか?
>それとも開放する必要は無いのでしょうか?

ども、中級者になりきれないsnowです。
mallocに対するfreeについてですが、必ずしもこれは行わなくてよいです。
これはCの規格ではないのですが、今の普通のPCなどに使われているOSならば
プロセス終了時に自動的に開放してくれます。
あくまでcase by caseですけど。
私はそれほど神経質にならなくてもいいかと思います。

また、少々蛇足ですが、mallocを宣言するとき
p = (struct list *)malloc(sizeof(struct list))
と書きますが、現在ではmallocの戻り値は(void *)になっているので
このキャストは不要です。(C++では(void *)はポインタ型変数にキャストできないので必要)


No.1551

Re:自己参照構造体の章のmallocについて
投稿者---ジャスミン茶(2002/05/20 18:47:33)


>ども、中級者になりきれないsnowです。
>mallocに対するfreeについてですが、必ずしもこれは行わなくてよいです。
>これはCの規格ではないのですが、今の普通のPCなどに使われているOSならば
>プロセス終了時に自動的に開放してくれます。
>あくまでcase by caseですけど。
>私はそれほど神経質にならなくてもいいかと思います。
>
>また、少々蛇足ですが、mallocを宣言するとき
>p = (struct list *)malloc(sizeof(struct list))
>と書きますが、現在ではmallocの戻り値は(void *)になっているので
>このキャストは不要です。(C++では(void *)はポインタ型変数にキャストできないので必要)

snowさん、返信ありがとうございます。

なるほど私のPCのOSはWindow2000なんですが、2000やXPのようなNTベースのOSの場合はプログラムの終了時に勝手にやってくれるから心配は要らない、という事ですよね。
ただ、例えば24時間動きつづけるデータベースアプリケーションのようなものの場合は、
データの削除があった場合などにその分のメモリの開放をしないと、リソースが減る一方になってしまいますよね?
という事は、その場合はやはりメモリの開放が必要になるという事でよろしいでしょうか?

その時は新規作成した構造体データのアドレスを格納する配列も動的に作っておけば良い?
いや、データの削除があった時にそのアドレスを開放すればいいのかな?
構造体のメンバを増やしたい時はどうすればいいんだろ?
うーん、なんだか複雑ですね。(^-^;
引き続き研究してみます。

No.1550

Re:自己参照構造体の章のmallocについて
投稿者---ともじ(2002/05/20 18:38:08)


>mallocを使った場合は必ず自分でfree関数を使ってメモリを開放しなければならないとあるのですが、
>自己参照構造体の章の例題では開放は行われていないようです。
>ただ、自分の環境では特に問題は起こっていません。
>もし、これを開放する場合は新規作成する度にその構造体変数へのポインタを配列(int型などのサイズの小さいもの)に格納して、プログラム終了時にforループなどで作成回数分だけfree関数で開放すればいいのでしょうか?
>それとも開放する必要は無いのでしょうか?

厳密には開放すべきですね。
(snowさん、フォローありがとうございます。)
リストの処理を追うという点でメモリ開放に重きを置いていなかった
ためと、実はあの章を作成する際にC言語のアルゴリズム関係の
テキストを2冊参考にしたのですが、両方ともfreeを行っていな
かったため、落としてしまいました。
この点については本日中に対応します。

さて、開放の方法ですが、これはリストの表示と同様の手順で、
ポインタをたどり順に開放するようにしてください。


No.1552

Re:自己参照構造体の章のmallocについて
投稿者---ジャスミン茶(2002/05/20 19:02:14)


>厳密には開放すべきですね。
>(snowさん、フォローありがとうございます。)
>リストの処理を追うという点でメモリ開放に重きを置いていなかった
>ためと、実はあの章を作成する際にC言語のアルゴリズム関係の
>テキストを2冊参考にしたのですが、両方ともfreeを行っていな
>かったため、落としてしまいました。
>この点については本日中に対応します。
>
>さて、開放の方法ですが、これはリストの表示と同様の手順で、
>ポインタをたどり順に開放するようにしてください。

ともじさん、はじめまして、ジャスミン茶です。
HPとても参考になります。

開放の方法なのですが、例えばリスト中の特定のものを削除するためにはどうすればよいのでしょう?
ポインタを繋ぎかえればよいのは分かるのですが、その分のメモリは依然として使われたままですよね?
私はそれぞれの構造体のアドレスを配列に登録していくのが分かりやすいかなと思っているのですが。
(ただ、この方法だと削除されたら後ろを1つ詰めないといけないですね。)
この方法ですとユーザーが特定のデータを見るときにも番号を指定するだけで良いですし。
アドレス用の配列も動的に確保しておけば無駄が少なくなりますよね。

もし間違っていたらスイマセン。
まだ始めて2週間程度なので…。

No.1558

Re:自己参照構造体の章のmallocについて
投稿者---ともじ(2002/05/20 21:38:31)


修正分UPしましたのでご確認ください。

>開放の方法なのですが、例えばリスト中の特定のものを削除するためにはどうすればよいのでしょう?

演習問題の方にそういった処理がありますのでご確認ください。

>まだ始めて2週間程度なので…。

2週間でリストですか。いやー、恐れ入りました。
どうも抜けを指摘していただいてありがとうございます。
これからも、ご質問、ご回答ともによろしくお願いします。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.06.28
Copyright(c) 2000-2002 TOMOJI All Rights Reserved