• ベストアンサー

windowsでのプログラミングについてなんですけど。

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

質問者が選んだベストアンサー

  • ベストアンサー
  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.2

 Windowsでも、プロセスを殺すとメモリを解放しますと書かれていますが、確かに簡単なプログラムでは解放します。  しかし、プログラムが複雑になるにつれ、リークが始まります。  しょせんそんな物と割り切って、自分が使ったメモリは自分で後始末しましょう。  Windowsの場合は、リークの確率が高く、簡単にリークするプログラムが作れてしまう事に問題があります。  メリット...まったくなし。プログラムを作る人間のバグです。

akino4
質問者

お礼

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

その他の回答 (1)

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.1

こんにちは、honiyonです。 UNIXですとリークしたメモリもきちっと解放してくれるんですね。  初めて知りました。  メモリリークをそのまま残しておくメリットは皆無だと思います。    メモリリークが解放されてない理由は、マイクロソフトの言葉を借りれば「Windowsの仕様」という事になります。  参考になれば幸いです(..

akino4
質問者

お礼

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

関連するQ&A

  • malloc後、frokを行った場合

    unix(Solaris)系、CCコンパイラ初心者です。 質問内容は2点あります。 1点目 たとえば変数Aを親プロセスでmallocを行い、その後forkした場合は 変数Aは子プロセスにも引き継がれると思いますが、 解放する場合は親、子プロセス両方でfreeする必要はあるのでしょうか? 2点目 1点目のmallocした変数Aをshmで共有メモリにした場合は 親又は子どちらか片方でfreeすればよろしいのでしょうか? よろしくお願いします。

  • C++ newについて

    お世話になっております。C++初心者です。 newについて質問です。 newして動的にメモリを確保したものはdeleteにて解放処理を 行わないとメモリリークしてしまうのはわかっているのですが、 newした動的メモリに再度newをするとどうなるのでしょうか? また、複数回deleteもせずにnewし続けたあとに deleteをした場合はすべて解放されるのでしょうか? 少し気になったので質問してしまいました。 よろしくお願いいたします。

  • JAVAにおけるメモリリーク

    クラスAの中でクラスBがnewされているとき、 クラスAの参照をnull にセットしさえすれば、 内包されているクラスBに確保したメモリも即時に解放されるのでしょうか? それともガーベジコレクションにてどこからも参照されていないことがわかった時点で解放されるのでしょうか? はたまた解放されないのでしょうか? ClassA {  ClassB instanceX = new ClassB(); } - - - - - - - - - - - - - - - - - - - - - - - - new をした際、そのメソッドの最後や、 Exceptionのキャッチ後のthrow前に、 変数 = null; は書いていますが、 これ以外ではどういう点に気をつければ良いかがわかっていません。 どういうときにJavaでメモリリークが起こるのでしょうか?

    • ベストアンサー
    • Java
  • mallocで確保したメモリをfree解放する必要

    当方、C言語を勉強中です。 mallocで確保しておいたメモリをfreeで必ず解放するようにと教わりました。 freeで開放しないことをひどく野蛮な言葉で例えられたのですが、それほどまでに必要である実感が実はあまりありません。 ファイルポインタでファイルを開いているときに、プログラムが終了すると開いているファイルを自動的に閉じるように、プログラムが終了すると自動的に解放されるものと思っていたのですが、やはりこちらはプログラム終了後も確保されたままになってしまうのでしょうか。 また、解放しないことによるデメリットで、メモリを圧迫する以外にはなにがあるのでしょうか。 ご教授おねがいします。

  • C#のガベージコレクタについて

    お世話になります。 現在C#で画像関連のプログラミングをしています。 ガベージコレクタがあるため安心してプログラムを組んでいたのですが、 参照されない画像を開放しないでいると、タスクマネージャーからメモリがどんどん増えていくのが確認できました。 具体的には、PictureBoxのImageに繰り返し代入していました。 ガベージコレクタは参照されなくなった変数を取りあえず放っておいて、 メモリが一杯になってきたら開放処理をするため、 快適なソフトを作るためにはできるだけガベージコレクタに頼らない方が 良いと考えました。 ですので今プログラム全体を見直して開放処理を加えているのですが、 厳密に言うとstring等にも開放処理を加えたほうがいいのでしょうか? newで確保した変数や、関数からオブジェクトを受け取った時などは全て開放しなければ いけないと思いますが、この認識で合っているでしょうか?

  • メモリとポインタと配列と

    malloc()を使用して可変の変数を作り加工。 後々に参照するためにポインタの配列に格納したいと考えております。 malloc()を行った後は必ずfree()にてメモリを開放せねばなりませんが、開放するとポインタの配列に格納した値も消えてしまいます。 だからといって開放せずにいるとメモリリークが起きてしまいます。 この様な場合はどのようにすればよろしいのでしょうか? 大体以下のような処理を考えております。 ご教授願えれば幸いです。 ****************************************   char *p[100];   for(int i=0;i<100;i++) {     char *word1 = "あいう";// ここでは固定文字を代入しているが、実際には何桁の文字列が入るかは不明。     int size = strlen(word1) + 1;     char *memo1 = (char *)malloc(size);     if (memo1 == NULL) {       printf("メモリを割り当てられません\n");       exit(1);     }     strcpy(memo1, word1);          //・     //・ *memo1 を利用した処理。     //・     char *word2 = "abc";// ここでは固定文字を代入しているが、実際には何桁の文字列が入るかは不明。     size = strlen(word1) + 1 + strlen(word2) +1;     char *memo2 = (char *)malloc(size);     if (memo2 == NULL) {       printf("メモリを割り当てられません\n");       exit(1);     }     memset(memo2, 0x00, size); //初期化     strcpy(memo2, word2);     strcat(memo2, "\t");     strcat(memo2, memo1);     p[i] = NULL;     p[i] = memo2;     free(memo2);     free(memo1);   } **************************************** 宜しくお願いします。

  • メモリ解放について(ASP)

    お世話になります。 VBscriptを利用したASPプログラムを作っています。 そこで、メモリ解放について質問があります。 set 変数 = nothingで解放を行おうとおもいますが、 これを使った方が良い変数(オブジェクト変数)と使っても意味がない、もしくは使ったらエラーになる変数というのは、何で判断すればよいのでしょうか? とりあえず、メモリリークを避けたいからすべての変数とオブジェクト変数をプログラムの最後で解放しようと思ったのですが、どうもエラーになる変数もあるようなので質問しました。

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

    趣味でプログラムの勉強をしています。 初歩的な質問になると思いますが、よろしくお願いします。 C言語やC++言語のように、動的に確保したメモリを使用後に意識して解放しないといけない言語で、解放の処理をしないままプログラム(アプリケーション)を終了した場合にはシステム(OS?)的にはどのような状態になるのでしょうか? 例: ・malloc して free しない ・new して delete しない 確保されたメモリ領域がそのまま残り、システムとして使用できるメモリ量が減る(解放にはPCの再起動が必要)のでしょうか? それともアプリケーションの終了時に自動的に解放されるのでしょうか? Windowsの場合を想定してご回答いただだけると嬉しいです。

  • 解放と開放 漢字について

    技術的な質問ではありませんが、国語カテゴリではなくこちらで質問させていただきます。 メモリを「かいほう」といったような場合、どちらの漢字が適切なのか気になり調べ、本件について議論されていたところを見つけました。 http://oshiete1.goo.ne.jp/qa1106226.html > [ちょっと息抜き]メモリを解放 or 開放? http://www.onionsoft.net/hsp/bbs/log/98.html > [18802] メモリ「解放」と「開放」について(正しい漢字) ※ 恐れ入りますがページ内検索をして参照される必要がありそうです。 教えて!goo での過去の質問を参照すると「解放」こそ正しいという印象を受けてしまいますが、 他方の [18875] Re^2: メモリ「解放」と「開放」について(正しい漢字) で挙げられているように、「開放」も同じくらい頻繁に用いられています。 「解放」こそ適していると言える。 意味的に(あるいは専門用語として)どちらを用いても問題ないと言える。 誤用である「開放」が俗用として通用してしまった。 などの考察を頂きたいと思い、改めて質問させていただきました。 宜しくお願い致します。

  • AF_UNIXのsocketと共有メモリを使ったリングバッファーの速度比較

    いま、仕事でlinux上で2つのプロセスを動かし、プロセスの間で、高速で大量のデータの受け渡しが必要なプログラムを作っています。プロセス間の通信は普通の socket で AF_UNIX を使っています。  できるだけ速度を上げたいのですが、AF_UNIXのsocketのかわりに共有メモリを使ってリングバッファーでキューを作ってデータを送るという案が出ました。この方法によって速度の向上は期待できるでしょうか?