• ベストアンサー

実行中にnewで領域確保した場合

終了時にdelete等で領域開放しなくても リソースの減少か何か 不都合が起きないのでしょうか? 必ずメモリ領域の開放をしなければ支障があるのでしょうか?

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

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 正常終了した場合は自動的に開放されます。  ですが、だからってパカパカ使ってれば当然システムを圧迫しますし、開放を司るプログラムが重くなります。  なので、できれば new したものは delete した方がいいでしょう。  プログラムの信頼性は、そういう地道な作業によって作り上げていくものです。

keyguy
質問者

お礼

ありがとうございます javaのように簡単にしてほしいものですね

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.5

#2,#3へのお礼を見ていると、 「newしたものをdeleteしなくても、正常終了させればいいや」 という結論になりそうなので一言。 プロ(他人に自分の作ったソフト/ソースファイルを使っていただく人間)を目指すならば、newしたものは必ずdeleteしましょう。 ソースを見られたとき、ちゃんとdeleteしていないところから、あなたの仕事の信頼性が疑われます。 また、#2の >OSがまともにメモリ管理をしていてくれていたらアプリ終了時にちゃんと解放されます。 という意見も、ちゃんと保障されているわけではありません。Windowsはもちろん、UNIX/Linuxでも終了時に開放されるとは100%言い切れないのです。 また、サーバー関係のプログラムは一度動かしたら24時間動き続けるものもあります。その様なプログラムでリソース確保しっぱなしをしたらそのプログラムだけでなくほかのプログラムにも影響を及ぼします。 「サーバープログラミングのときは注意するよ」というかもしれませんが、「newしたらdelete」を習慣にしている人でも時にdeleteを忘れてしまうことがあります。習慣にしていない人間ならば確実にその危険性は増えます。 繰り返しになりますが、自分でnewしたものは必ずdeleteすることを習慣として身に付けましょう。

keyguy
質問者

お礼

ありがとうございます newしたものを途中で破棄できる場合は破棄しているのですが最後はどうせ終わるのだから利用していたものをすべて破棄する手間を省こうとしたのです newで確保したポインタをnewするたびにベクタにプッシュしておき最後にベクタにたまっているポインタをすべて取りだし一つづつデリートしていくようにしました

全文を見る
すると、全ての回答が全文表示されます。
noname#25358
noname#25358
回答No.4

 ちなみに、参考までに Java の場合はもっと面倒です。  アプリ側としては null を入れてやればそれで終わりですが、裏ではガーベージコレクション(通称GC)というプログラムが、必死こいて「もう開放しても構わないメモリ」を探しつづけています。  小さなプログラムなら大した問題にはなりませんが、メモリを馬鹿食いするようなロジックだと、このGCの動作時にシステムを圧迫します。  よって、Java はロジックのチューニングによってしか、メモリを管理することができません(裏技とか使えばまた違うんでしょうけど)。  Cと Java のメモリ管理は、それぞれ一長一短なんです。

keyguy
質問者

お礼

ありがとうございます ひとつ勉強になりました

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

メモリのことだけを考えるのであれば, 「普通の OS」でリークすることはありません. このくらいのメモリ管理は OS のお仕事です. メモリが十分にあるのなら, むしろプログラム中で毎回 delete するより全くしない方が速くなる可能性もあります. ただし, セマフォなど他のリソースまできちんと OS が面倒をみているかどうかは不明.

keyguy
質問者

お礼

ありがとうございます 途中の開放でなく終了時(WM_CLOSE)の開放ですから実行速度の問題は無いと思います きちんと清算することにメリットが無いのならばしないほうが楽ですね?

全文を見る
すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

OSがまともにメモリ管理をしていてくれていたらアプリ終了時にちゃんと解放されます。 ちなみにWindows3.1は確実にリークします。

keyguy
質問者

お礼

ありがとうございます OSを信用すればいいのですね

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C++のnewで確保した領域について

    こんにちわ。C++を勉強し始めた者です。 new演算子を使ってインスタンスを生成した場合、それはスタックではなくヒープ領域に確保され、不要になったらdeleteを使って領域を解放しなければいけない認識です。 C++の初心者向けサンプルコードを見ていて疑問があったので質問させてください。 (例)クラスA.cpp ======================== #include <Car> #include <Garage> ~略~ クラスAのコンストラクタ{ Car *mycar = new Car("プリウス"); addGarage( mycar ); } クラスAのデストラクタ{ } ======================== 上記のような実装のクラスAがあったのですが、コンストラクタでCarクラスのインスタンス生成をして、オート変数の*mycarに格納して、Garageの公開関数に渡しています。 質問1:このクラスAをインスタンス生成した場合、コンストラクタで確保したヒープ領域は、プログラム終了時まで解放されない認識であっていますか? 質問2:オート変数の*mycarはコンストラクタからreturnした時点で解放されてしまうので、今のままではデストラクタでヒープ領域をdeleteできない認識であっていますか? 質問3:newで生成したインスタンスへのポインタは、その関数内でdeleteしない場合、メンバ変数やstatic変数、グローバル変数に格納しなければdeleteできなくなるという理解であっていますか? 質問4:C++のコードでnewした戻り値をオート変数に格納するプログラムは通常使うことはあるのですか?

  • VB.NET Newを繰りかえす場合の処置について

    お世話になります、早速質問です。 環境は、VisualBasic.NET 2003です。 フォームの中の処理 Public ClassBBB As ClassXXX Sub AAA() ・ ・ ClassBBB = New ClassXXX() ・ ・ End Sub 上記のような処理があり、AAA関数が繰り返し呼び出される場合、<New ClassXXX()>が繰り返されることで、メモリがどんどん消費されるということになるのでしょうか?そうだとするとどんな処置が必要でしょうか? 私としては・・・ 1.ClassBBBはグローバル(パブリック)で宣言された1つの領域なので支障なし 2.<New ClassXXX()>が実行されると、一時的にメモリは消費されるが、Sub AAAが終了した時点で開放されるので支障なし →よって、繰り返しAAAが処理される場合でも、特別な処置を行う必要はないと理解してますが・・・ 実際のところは、どうなんでしょうか? ご教示ください。(できれば、どんな理由で大丈夫なのかもわかるとありがたいです) ("ここを見ろ"でも結構です、よろしくお願いします)

  • 動的なメモリ領域の確保

    double型変数5個分のメモリをmalloc関数により確保し,その確保した要素のアドレスを表示するように,プログラムを作る問題で、 (注)に「 %pで表示するためには,double型へのポインタ(double *)をvoid型へのポインタ(void *)にキャストする必要がある.」と書かれていたのですが、どういうことでしょうか? 以下のようでいいのでしょうか? #include<stdio.h> #include<stdlib.h> #define COUNT 5           // 動的に確保するメモリ領域数を示すマクロ定数の定義 int main(void) {  // 動的に確保するメモリ領域のアドレスを保持するポインタ変数の宣言  double * pointer;  int i;                  // for文で使用する変数の宣言  // int型変数5個分のメモリ領域を確保  pointer = (double *)malloc(sizeof(double) * COUNT);  if(pointer == NULL) {        // メモリ領域の確保が失敗した場合   printf("メモリ領域を確保できませんでした.\n");   exit(1);                // プログラムの終了  }  for(i = 0; i < COUNT; i++)   printf("%d番目のアドレスは%pです.\n", i + 1, pointer + i);  free(pointer);            // 確保したメモリ領域の解放  return 0; }

  • メモリ領域確保に関して

    C言語を始めて3ヶ月の初心者です。 下記のような定義で、領域確保をしたいのですが、 うまい方法がわかりません。 ご存知の方いらっしゃいましたら、 御知恵をお貸し下さいませんでしょうか? <test.h> ================================== #define SIZE_A (5) /* 親構造体 */ typedef struct { int testInt; testSmallStructT *testSmall; // 7バイト構造体の配列 char *testChar; // SIZE_A分の領域*配列数 } testBigStructT; /* 7バイト構造体 */ typedef struct { char str1[3]; char str2[4]; } testSmallStructT; /* メンバ変数 */ testBigStructT gTest[10]; ================================== ここで、あらかじめ全体の領域サイズを算出して、 mallocにてエリア確保を行う方法を求めてます。 また、多数にmallocを使用するとメモリ確保失敗時に、 それまで確保したエリアの開放を行わなくてはいけなくなる懸念から、 できるだけ使用しないようにしたいのです。 メンバ変数gTestを10の配列で持ち、構造体testBigStructTの、 要素testSmallとtestCharを可変の配列として扱いたくポインタ定義をしており、 更に、testCharにSIZE_A(5byte)の領域を確保しようとしております。 最終的には、下記のような使い方をしたいのですが、 メモリ確保の方法がわかりません。 =================================== (EX:) strcpy(gTest[0].testSmall[0].str1,"aaa"); strcpy(gTest[3].testSmall[2].str2,"bbb"); strcpy(gTest[6].testChar[3],"cccc"); =================================== 開放は下記の記述で問題ないと思っております。 free(gTest); 大変申し訳御座いませんが、 ご指摘・ご指導願いませんでしょうか? どうか宜しくお願い致します。

  • 動的確保について

    こんばんは。プログラミングについてお聞きしたい事があり 投稿させて頂きました。初心者なので見当違いでしたら申し訳 ありません。 現在、C言語でプログラムを作成しているのですが、メモリの 動的確保をする際、確保する領域の先頭アドレスを指定するという ことは出来ないのでしょうか。 現在はmallocを使用して領域を確保していますが、実験の都合上、 どうしても自分で確保すべき領域を指定したくなりました。 調べても分からないのでもしノウハウをお持ちの方がいましたら 教えて頂けますでしょうか。 宜しくお願い致します。

  • Tomcatのメモリ領域確保について

    素人質問でスミマセン。 Apache+Tomcatでシステムを作っているのですが、ダウンロード処理でダウンロードファイルのサイズがTomcat起動時のtomcat.sh内に記述している tomcat_opt=-Xmx128M を超えてしまいダウンロード処理のエラーとなってしまいます。 Tomcatの起動時のオプションの128Mの数字をもっと大きくした際、メモリオーバーになっているダウンロード処理以外のプログラムでも同じメモリ領域を確保してしまうとOSのメモリが足りなくなり、ほかのアプリケーションにも影響するのが怖くて数字は変えてません。 で、WebでJavaのメモリ管理の基本を調べていると、Tomcatではないですが、以下のようなコマンドパラメタがあると書いてありました。 -Xms[n]...ヒープの初期サイズ。 -Xmx[n]...ヒープの最大サイズ。 これは、XmsとXmxを併記した場合、Tomcat上で動くプログラムで動的に必要なメモリ領域を最大サイズまで確保してくれるという理解でよろしいのでしょうか? また、Tomcat.shの起動オプションも同じ理解でよろしいのでしょうか? 素人質問でスミマセンがよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 配列の中身のdelete

    こんにちは 配列を使った際、うまいことDeleteが働いてくれないため メモリが開放されずに困っています、 初歩的な質問で申し訳ありませんが、質問させて下さい。 下記のプログラムでは、 単純にメモリ確保とメモリ開放を行っていると思うのですが… 注釈にもあるように、Deleteでメモリが開放されません。 #include <iostream> using namespace std; class Base { }; class Sub : public Base { char size[256];//領域確保用 }; void main() { Base* obj[10000]; for(int cnt=0;cnt<10000;cnt++) { obj[cnt] = new Sub; } for(int cnt=0;cnt<10000;cnt++) { delete obj[cnt];//メモリが開放されない } } ポインタが怪しいと思うのですが、 どうにかうまいことメモリを開放することは出来ないでしょうか。 よろしければ返答お願いいたします。

  • new領域確保について

    お世話になります new演算子の使用方法について教えてください。 new演算子は、動的確保を行なう際に使用する事は知っております。 もう1つの使用理由として、関数内のローカル変数領域が多大になる場合に 使用すると聞いた事があります これは、スタック領域を圧迫しないためと説明を受けた記憶があります これがあってるとしたら、どれくらいの変数容量を宣言する際に、new演算子を使用するのでしょうか? よろしくお願い致します

  • newを使った領域の動的確保

    お世話になります。 C++での記述方法なのですが 構造体Testの領域を確保しておいて値を入れます。 確保しておいた領域では領域が不足するときに 不足分を追加したいのですがどうすればよいでしょう? Cではreallocを使えばよいと思うのですが C++ではmallocではなくnewを使ったほうがよいと聞きました。 newした領域を再定義した場合(deleteせずに領域を追加) 先に領域に入れたデータは保証されるのでしょうか? 以下例文ソース*部分 以下例文のソース Test *a; a = new TEST[10]; int cnt; int i; for(i = 0;i<10;i++){  //ここでTESTの配列aに値を入れる } cnt = 12; if( cnt > 10 ){  //予想サイズを上回ったら足りない分のサイズの領域を確保し  //データを入れる  a = new[cnt];//*ここで領域を再確保したら元のa[0]~a[9]の         //データは確実に保持されるのか?         //または他に領域を確保する方法があるのか? } 上記例文ソースでは先にcntで領域を確保すれば良いようにみえますが やりたいことは 先に確保されている領域を広げて 先に入れてあったデータと、広げた領域に入れたデータを使いたい のです。 分かりにくい文章かもしれませんがよろしくお願いします。

  • Cドライブの空き領域が急減したのは何故ですか?

    「ハードディスクを最適化する」ため「ディスクデフラグツール」から「今すぐ最適化」をクリックしたところ、最適化が終了した時点で直前のCドライブの空き領域が10.42GBから7.48GBに約3GB減少してしまいました。操作が誤っているのでしょうか。空き領域は元の10.42には戻らないのでしょうか。

印刷消費量換算の算出方法
このQ&Aのポイント
  • 印刷消費量換算の算出方法を教えてください
  • 質問者は、換算の算出方法の切替に関して相談しています
  • 質問者の環境は、Windows10で無線LAN接続です
回答を見る