←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4298

プログラム終了時のメモリ開放
投稿者---レガッタ(2005/07/14 17:19:43)


はじめまして。
C++ の質問で申し訳ないのですがよろしくおねがいします。

new演算子や malloc で動的に確保したメモリ領域はプログラム終了時(メイン関数からぬける際)に開放されるのでしょうか?
それとも、ずっと残ってしまうのでしょうか?

プログラム終了する際に、開放処理を記述するかどうかで迷っております。

よろしくおねがいします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:プログラム終了時のメモリ開放 4299 まきじ 2005/07/14 17:47:42
<子記事> Re:プログラム終了時のメモリ開放 4301 アンドロオイド 2005/07/14 23:39:41
<子記事> Re:プログラム終了時のメモリ開放 4304 YuO 2005/07/15 02:07:03


No.4299

Re:プログラム終了時のメモリ開放
投稿者---まきじ(2005/07/14 17:47:42)


>new演算子や malloc で動的に確保したメモリ領域はプログラム終了時(メイン関数からぬける際)に開放されるのでしょうか?

malloc() に関しては、
http://www.st.rim.or.jp/~phinloda/cqa/cqa4.html に
「おそらく、殆どの処理系では、建前として、プログラムが終了した時点で
獲得されたメモリは全て自動的に開放されることになっていると思われます。」
と記載されています。

>プログラム終了する際に、開放処理を記述するかどうかで迷っております。

関数の利用についてのレスで私は、必ずしも解放する必要はないと思ってます。


この投稿にコメントする

削除パスワード

No.4301

Re:プログラム終了時のメモリ開放
投稿者---アンドロオイド(2005/07/14 23:39:41)


>プログラム終了する際に、開放処理を記述するかどうかで迷っております。
>
この書き方だと、不要なメモリーでも終了するまで解放しないということですか。それは、資源の無駄遣いです。不要になったら即刻解放してください。


この投稿にコメントする

削除パスワード

No.4304

Re:プログラム終了時のメモリ開放
投稿者---YuO(2005/07/15 02:07:03)


>new演算子や malloc で動的に確保したメモリ領域はプログラム終了時(メイン関数からぬける際)に開放されるのでしょうか?
>それとも、ずっと残ってしまうのでしょうか?

標準としては,未規定,というのが立場だと思います。
確か,解放されるともされないとも書いていないはずです……。
# そもそも,プログラム終了後の世界に関して,標準は何も言っていない。

現実的な立場から言うと,operator new/mallocで割り付けられた記憶域は,
プロセスの終了時にOSの回収対象になるでしょうから,
プロセス終了後に解放されると思われます。
# メイン関数から抜ける際というタイミングでは絶対に解放されない。
# atexitや静的な期間をもつオブジェクトのデストラクタなどが走るから。


>プログラム終了する際に、開放処理を記述するかどうかで迷っております。

mallocであれば,freeする必要はないでしょう。
ただし,newの場合はdeleteするべきです。

PODならともかく,リソースを保持している場合などで,
特にネットワーク関連リソースを保持していると相手に迷惑をかけることになりますので。
# 正常な通信の終了がなされない可能性が高い。



この投稿にコメントする

削除パスワード

No.4305

Re:プログラム終了時のメモリ開放
投稿者---レガッタ(2005/07/15 09:42:08)


皆さん、アドバイスありがとうございます。

言葉足らずでしたが、私の懸念としては、
プログラムの起動→終了を複数回繰り返した時、メモリの使用率がどんどん上がっていって、
最後にはOSが落ちたりしないのかな。
と思ったしだいです。(プログラム実行中は常に領域を確保していたい)

皆さんのアドバイスを元にした、私なりの考えは、
プログラム終了後は'未規定'ということなので、「明示的に開放処理を記述する」
と結論付けました。

ここでまた質問で申し訳けないのですが、「終了時 new/malloc 共に明示的に開放処理を記述する」
とした時に、ソースステップ数が増えるのと終了処理に若干の時間がかかる以外の問題はありませんでしょうか?

よろしくおねがいします。


この投稿にコメントする

削除パスワード

No.4306

Re:プログラム終了時のメモリ開放
投稿者---nop(2005/07/15 10:49:04)


>ここでまた質問で申し訳けないのですが、「終了時 new/malloc 共に明示的に開放処理を記述する」
>とした時に、ソースステップ数が増えるのと終了処理に若干の時間がかかる以外の問題はありませんでしょうか?

何故、解放処理を書くと問題があると思うのでしょうか?
むしろ、解放処理を書かない場合の方が問題が出るのでは?
と考えるのであれば理解できますが…。


この投稿にコメントする

削除パスワード

No.4311

Re:プログラム終了時のメモリ開放
投稿者---Hermit(2005/07/15 19:28:58)


>何故、解放処理を書くと問題があると思うのでしょうか?
>むしろ、解放処理を書かない場合の方が問題が出るのでは?
>と考えるのであれば理解できますが…。

NULL 以外の malloc(その他メモリ確保)した領域以外や、
一旦 free した領域を開放した場合の動作は未定義だと思うので、
OSが勝手に開放してくれる通常のOSでは、
プログラム終了時にまでわざわざ開放して、
バグを生み出す可能性を増やす必要はないと思いますが。

システムコールによるメモリー確保などは、
開放しないこともあるので、かなり注意がいるかもしれませんが。


この投稿にコメントする

削除パスワード

No.4312

Re:プログラム終了時のメモリ開放
投稿者---nop(2005/07/16 01:27:14)


>NULL 以外の malloc(その他メモリ確保)した領域以外や、
>一旦 free した領域を開放した場合の動作は未定義だと思うので、

それは、プログラムのバグでしょう。
解放処理による問題ではないでしょう。

>OSが勝手に開放してくれる通常のOSでは、
>プログラム終了時にまでわざわざ開放して、
>バグを生み出す可能性を増やす必要はないと思いますが。

「OSが勝手に開放してくれる」事を望めない環境へ移植する可能性があるのであれば、
書いておいても良いのではないでしょうか?

そもそも、「必ず書け」とも言ってないし。
解放処理をプログラマが書くことによる問題は、
その分のコーディング・デバッグなどの時間的なもの以外、
プログラム的に問題になることは無いでしょう。
誰かが解放しなければならないのは確かなのですから。


# ちなみに、開放では意味が異なるよ。(w


この投稿にコメントする

削除パスワード

No.4313

Re:プログラム終了時のメモリ開放
投稿者---nop(2005/07/16 01:30:07)


<追記>
私の私見としては、「好きなように書け」と言うことです。
書きたい人は書けばいいし、書きたくない人は書かなければいい。

# OSが解放してくれる場合は


この投稿にコメントする

削除パスワード

No.4344

Re:プログラム終了時のメモリ開放
投稿者---レガッタ(2005/07/19 09:06:23)


皆さん。アドバイスありがとうございました。
プログラムミスとならない範囲で、明示的に解放処理を行っていこうと思います。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity