UNIXの本を読んでると、プログラムはexitシステムコールが呼ばれると、
freeregを呼び出し、malloc済みメモリをすべて開放し、共有メモリについても
参照が0になったら解放するようになっていて、仮にメモリリークする
プログラムで会ってもプロセスを殺せば、そのプログラムのリークした分は
すべて解放されるんですよ~~~それと同じ感覚で、windowsでプログラム
やってる友達に聞いたら、プロセスを殺してもnewでリークしたのしっぱなしに
なるっぽいよ~って言ってたんですよ。それって本当なんですか?
てか本当ならあえてそうしてるメリットってあるんでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

 Windowsでも、プロセスを殺すとメモリを解放しますと書かれていますが、確かに簡単なプログラムでは解放します。


 しかし、プログラムが複雑になるにつれ、リークが始まります。

 しょせんそんな物と割り切って、自分が使ったメモリは自分で後始末しましょう。

 Windowsの場合は、リークの確率が高く、簡単にリークするプログラムが作れてしまう事に問題があります。
 メリット...まったくなし。プログラムを作る人間のバグです。
    • good
    • 0
この回答へのお礼

なるほどね~~~やっぱあれは単なるバグなんだぁ~~
OSのバグか自分のコードのバグか分からないなんて・・・・
windowsプログラマってよっぽど寛容なんですね~~~
おいらは・・・・・精神的にむりそう(^^;

お礼日時:2001/06/06 11:18

こんにちは、honiyonです。


UNIXですとリークしたメモリもきちっと解放してくれるんですね。
 初めて知りました。

 メモリリークをそのまま残しておくメリットは皆無だと思います。
 
 メモリリークが解放されてない理由は、マイクロソフトの言葉を借りれば「Windowsの仕様」という事になります。

 参考になれば幸いです(..
    • good
    • 0
この回答へのお礼

リークてか・・・解放するのが普通のOSでしょっておもってたのは
おいらだけかな?(^^;
やばいなぁ~~この前レポートで書いたプログラムVCでコンパイルしたけど
あれはwindowsではだめなのか(笑)
どもです

お礼日時:2001/06/06 11:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qメモリの解放について

メモリの解放について
c#で、Mysqlへデータセットするプログラムを作っているのですが、登録する度にメモリが増加していきます。昔、VC++で同じようなプログラムを作成した時にも同現象が発生したので、SetProcessWorkingSetSize()を使って解決したのですが、c#では、解決する方法はあるのでしょうか?
ご教授お願いいたします。

Aベストアンサー

DataSet はレコード操作をSQL 文として保持しています。Update() 時に実行する訳です。

従ってレコード操作の度にメモリを消費してゆくのは当然かと思います。といっても微々たるもんでしょう?


まぁソレとは別に、ガーベッジコレクタは必要な時にしか動きません。あなたがメモリ消費について心配しなくてもいいはずです。
#メモリが少ない環境ではそれなりに早めにメモリ破棄が行われますから。ガーベッジコレクタには強制的に発動するメソッド(System.GC.Correct()?)もありますが・・・、これ実際の動作はどうだったかなぁ・・・。


.Net のガーベッジコレクタは今は十分に信頼できるはずですよ。

QASP.NET(C#)のメモリ解放について

少し質問しづらいのですが、
ASP.NET(C#)でメモリ解放を行う場合、
・変数
・インスタンス
・セッション
の3つを使い終わった後に、nullやRemoveしておけば、
そのうちガベージコレクションでメモリ解放されるのでしょうか。

他にも何か使い終わった後に処理しておかないといけない、
(データ接続などを閉じておくなど)

Aベストアンサー

参考にならないかもしれないけど、参考。

http://www.atmarkit.co.jp/fdotnet/dotnettips/021gc/gc.html

基本的には明示的にnullしなくとも解放してくれるものだと思っています。
とは言っても、私はaspは触ったことすらないので、さっぱりわかりません。
適当でごめんなさい。

Qメモリを解放しないとどうなる?

趣味でプログラムの勉強をしています。
初歩的な質問になると思いますが、よろしくお願いします。

C言語やC++言語のように、動的に確保したメモリを使用後に意識して解放しないといけない言語で、解放の処理をしないままプログラム(アプリケーション)を終了した場合にはシステム(OS?)的にはどのような状態になるのでしょうか?

例:
・malloc して free しない
・new して delete しない

確保されたメモリ領域がそのまま残り、システムとして使用できるメモリ量が減る(解放にはPCの再起動が必要)のでしょうか?
それともアプリケーションの終了時に自動的に解放されるのでしょうか?


Windowsの場合を想定してご回答いただだけると嬉しいです。

Aベストアンサー

#1さんの回答の通りです。
プロセスが終了すると、使用していた資源は
解放されます。ファイルも閉じられます。
mallocを無限に繰り返すプログラムを作り、
これを実行します。タスクマネージャで見ると、
ページファイル使用のラインが上がりっぱなしに
なりますが、プロセスを強制終了させると、元の
レベルに下がるのが観測できます。

QrubyでC言語のexitにあたる構文は?

現在、C言語のプログラムをrubyに書き換えています。

そこで、C言語のexitに当たるrubyの構文、もしくは、
文法が見つからず、困ってます。
(ある条件になったら、強制的にrubyの実行を
 停止させたいのですが、、、)
(__END__ですか?)

詳しい方が居ましたら、ご指南下さい。

Aベストアンサー

#2です。
>exit のあとの数字について詳しく知らないので、
>教えていただけたら幸いです。
exitのあとの数字は終了コードといって、どのような状態で、このプログラムが終了したかを、呼び出しもとに伝える為のものです。
この値は、呼び出し元と、呼び出される側(このプログラム)との決め毎なので、どのようにきめてもかまわないのですが、
ふつうは、終了コード:0で終了したときが、正常終了にします。
それ以外の値は、異常終了を示す値にします。

この終了コードは、なにかのサブルーチンを作ったときの、戻り値に似ています。
サブルーチンの戻り値は、呼び出しもとと呼び出される側(サブルーチン側)とで、自由にきめて良いのですが、
通常は、正常:0、以外は、それなりの異常にしますよね。

QC# VBAで言うexit subについて

お世話になります。
もしかしたら相当単純な事を聞いているかもしれませんが
教えてください。

今、C#で物作りを行っているのですが、
画面からある登録ボタンを押下後、項目のチェックをして
問題ないならそのままmdbに登録するような作りを考えています。
一般的だと思いますが。

ボタンをおした後
if文を押して
private void button1_Click(object sender, EventArgs e)
{
if (comboBox5.Text.Trim() == "")
{
MessageBox.Show("~");
}
else if ~

って感じなんですが、
メッセージを表示した後(textが空白の時です。)に、このprivateの処理を終わらせたいのですが
どのようにすれば良いのでしょうか?
vbaで言うと、exit subのような感じです。

どなたか教えて下さい。
宜しくお願いします。

Aベストアンサー

単に実行分がなければいいのですが ・・・

private void button1_Click(object sender, EventArgs e)
{
  if (comboBox5.Text.Trim() == "")
  {
    MessageBox.Show("~");
  }
  else if (何らかの条件)
  {
  }
}
といった具合で

強制的にイベントから抜けるのであれば
private void button1_Click(object sender, EventArgs e)
{
  if (comboBox5.Text.Trim() == "")
  {
    MessageBox.Show("~");
    // ここにreturnを追加
    return;
  }
  else if (何らかの条件)
  {
  }
}
といった具合でしょう


人気Q&Aランキング

おすすめ情報