• ベストアンサー

newでの動的生成について

質問ばかりで恐縮です。 周りに話の出来る人がいないので。 本にむやみにnewでオブジェクトを生成することはメモリリークの原因になるので避けたほうが良いとありました。 newはメモリを節約するためにある。 しかしながら、今のPCはメモリを十分つんでいる。 よってnewは使わないほうが良いとありました。 そこで知りたいのは、この話が本当かということもありますが、 それとは別に、newを使わざるを得ない時はどう言う時かということです。 CとC++とMFCそれぞれの場合においてどうなのでしょう?

  • mk1234
  • お礼率94% (1832/1940)

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>本にむやみにnewでオブジェクトを生成することはメモリリークの原因になるので避けたほうが良いとありました。 まぁ、むやみやたらにnewすると、解放ロジックの抜けでそういうことになります。 >newはメモリを節約するためにある。 これは違うでしょう。 必要なサイズや個数がわからないときに、動的にメモリを確保したりするものです。 >しかしながら、今のPCはメモリを十分つんでいる。 うそです。 普通の変数(オート変数)は、スタックに確保されます。 こんなところに、100Mとか確保したら動作しません。 >そこで知りたいのは、この話が本当かということもありますが、 えらい怪しい話ですね。 >それとは別に、newを使わざるを得ない時はどう言う時かということです。 この前に書いちゃいましたが、サイズや数が不定なときですかね。 MFCでわかりやすい例をあげるとすれば、MDIのアプリかな? 子ウィンドウは、newでクラスのインスタンスを作りますよね。 これをフレームウィンドウのメンバ変数なんかにしたら、 その時点で子ウィンドウの作成可能な個数が決まってしまいます。 あとは、関数の呼び出し元でもその領域やインスタンスを使いたいときですね。 具体的には、引数では作成したいクラスを指定して、戻り値でアドレスを返してもらうときなんて感じです。 COMコンポーネントはこれに近い形でインスタンスの生成を行うのが普通です。

mk1234
質問者

お礼

回答ありがとうございます。 newでdeleteを忘れずですね。

その他の回答 (2)

回答No.2

「newを使用するとメモリリークの原因になるので避けたほうがよい」 たしかにメモリリークはnewを使用したために発生します。固定長の配列を使用することで解決するなら、そちらのほうがよいでしょう。 ただし、メモリリークはnewでメモリを確保してdeleteで削除(解放)しなかった場合に発生します。つまり、きちんとdeleteしていればメモリリークは発生しません。 つまり、メモリリークが発生する「可能性がある」というのが正しい表現だと思いますが(そもそも、メモリリークが発生するのはバグがある証拠なのですが……)これを理由にnewを使用するのを避けたほうがよいというのは少々乱暴だと思います。 「newはメモリを節約するためにある。 しかしながら、今のPCはメモリを十分つんでいる。 よってnewは使わないほうが良いとありました。 」 これははじめて聞きました。newはメモリを動的に割り当てるために使用するものだと思っていたので。 もし、私がこの本をよんだとしたら、この記述は完全に無視します。 現実問題としてnewを使用せずプログラムを書くことは、ほぼ不可能だと思います。 これでは線形リストや可変長文字列クラスなどが実現できません。 ただ、むやみにnewを使用し、deleteしないでメモリを喰い散らかすようなコードはいただけませんが……

mk1234
質問者

お礼

回答ありがとうございます。

回答No.1

微妙な本ですね。気になりますね。できたら本の名前教えてください。 動的メモリnewは、実行時に決められるメモリ量に増減が激しいときに有力です。ユーザーが入力した文字を保存するのにその文字分のメモリを用意するだけでいいということができます。 逆に使わないと、これいないに収めてくれっていうメモリを確保します。メモリを10MB抑えていたのに、1MBしか入力しなかったとき、9MBの浪費です。また、10MB以上確保できない、これが仕様となります。多分もう想像できるとおもいます。 C,C++,MFCでもこれは変わりません。

mk1234
質問者

お礼

回答ありがとうございます。 私が知りたいのは、newを使わずにコードを書くことができるか?ということです。 本は C++クラスと継承 完全制覇 p219です。

関連するQ&A

  • newしないオブジェクトについて

    C++で オブジェクト生成時、NEW しない場合、 どこにメモリ領域が作られているのでしょうか? また、newはmallocと同じで、動的にメモリを確保ということはわかるのですが、 では、newしない場合、静的ということになるのでしょうか? そうだとすると、静的なオブジェクトとは一体どのようなものをいうのでしょうか? よろしくおねがいします。

  • オブジェクトの生成

    C++におけるオブジェクトの生成ですが、 普通の変数と同様に宣言するの方法と、 newを使用して動的に生成する方法があります。 色々調べてみて、理屈では判ったつもりなのですが、 newで動的にメモリに確保する、 と言う事の使いどころが、今ひとつピンときません。 どの様な場合、実行時にどれだけメモリが必要かわからないのでしょう? ちなみに、私は、Cではバッチ処理の開発を主に行ないましたが、或いは、クライアント/サーバ系などでは必須なのでしょうか? 宜しくお願い致します。

  • new Date()について。

    new Date()について。 newは予約語で、始めからDateというオブジェクトはwindowのようにブラウザを起動する際に一緒に準備されていないので、 それらの組み込みオブジェクトを使う場合、newを使って次のようにオブジェクトを生成するときいたのですが、 生成とはもともと存在しないものを作るということなのでしょうか? ただそれですと矛盾するので、始めから存在するdateオブジェクトを使えるように準備する作業がnew オブジェクト名()という 式ということなのでしょうか? 始めから使えないオブジェクトを使えるように準備する方法がnew オブジェクト名()と丸暗記するしかないのでしょうか? そもそもなんでnewなんですかね? jsの話です

  • C++ newについて

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

  • クラスのインスタンスの生成

    javaの勉強を始めたばかりの初心者です。 クラスのオブジェクトの生成方法は(1)の方法だけだと思っていたのですが, 本を読んでいると以下の(1)~(3)の3種類の生成の方法がでてきます。 オブジェクトの生成方法について以下の質問にお答えいただきたいです。 【質問1】 (2)のオブジェクトの生成方法は以下のような考え方でしょうか? BufferedReader br = new BufferedReader(); InputStreamRader k = InputStream(); BufferedRader br = new BufferdRader(k); これを省略して・・・ BufferedReader br = new BufferedReader(new InputStreamReader ()); 【質問2】 (3)のオブジェクト生成方法は以下の考え方でしょうか Container ct = new Container(); ct = frame.getContentPane(); これを省略して・・・・ Container ct = frame.getContentPane(); 【質問3】 オブジェクト生成方法はこの3種類の他にもあるのでしょうか 【質問4】 (1)~(3)の方法には使い分け(ルール)があるのでしょうか? 例えば「このクラスの場合この方法」というような -------------------------------------------------------------------- (1)MyClass br = new MyClass();   クラス名 オブジェクト = new コンストラクタ; -------------------------------------------------------------------- (2)BufferedReader br = new BufferedReader(new InputStreamReader ()); -------------------------------------------------------------------- (3)Container ct = frame.getContentPane(); --------------------------------------------------------------------

    • ベストアンサー
    • Java
  • C++のnewの使い道

    最近C++を勉強しているのですが、new演算子はどういうときに使うべきでしょうか? メモリを動的確保できるのはわかります。 Cのmallocのようなものと考えていいのでしょうか? つまり、関数内でメモリを確保してそのアドレスを返すとか、コンパイル時に不明なサイズのメモリを実行時に確保するとか、任意のタイミングでメモリを開放したい場合などに使うものでしょうか。 ある参考書を読んでいると「引数つきコンストラクタを呼び出す場合はnewでインスタンス生成する」と書いてありました。 デフォルトコントラスタならnewなし、引数付きならnewあり、ということらしいです。 なぜこんなことをする必要があるのでしょうか?

  • クラスの生成の仕方

    PHP Version 5.1.6を使っています。 よくクラスのオブジェクトを生成する時に「=&」で生成する記述を 多く見かけるのですが、自分はまだ「&」を付けることによる メリットがよく分からないので教えてもらえないでしょうか? また逆にデメリットなどもあるのでしょうか? 分かりやすい例などあったら是非知りたいです。 $obj1 = new Hoge() $obj2 =& new Hoge()

    • 締切済み
    • PHP
  • newで個別に生成した配列にNULLを代入しても大丈夫か

    C++にて要素数が不定の配列のクラスをnewで生成します。 このとき、newで一度に全ての配列を生成するとメモリをかなり取るので、 指定された要素番号のみを生成したいのでダブルポインタにし、 全体を生成してから個別にクラスを生成することで、 思い通りの処理ができるようになりました。 (生成する番号は0→1→2みたいな順列ではないため) しかし、ここで1つ問題が発生しました。 まずは以下にそのソースを示します。 ----------------------------- class CHOGE {   int a; public:   CHOGE(){ a=999; }   void print(){ cout<<a<<endl; } }; ----------------------------- void main(){   CHOGE **p = new CHOGE*[3];   if( p[0] != NULL ){ // ←条件を通過してしまう     cout << "ほげ~" << endl; // ←表示される     //p[0]->print(); // ←当然エラー   }   p[0] = new CHOGE();   p[0]->print(); // ←OK   delete p[0];   p[0] = NULL;   delete [] p;   p = NULL; } ----------------------------- 上記は3個の要素の配列を生成してから、 個別に0番目の要素のインスタンスを生成しています。 しかし、上記main関数の3行目では、 インスタンスはまだ生成していなにもかかわらず NULLチェックを通り過ぎてしまいます。 そこで上記main関数の2行目に  for(int i=0; i<3; i++) p[i] = NULL; という処理を入れると期待通りに動いてくれるのですが、 どうも引っかかるといいますか、何かの情報を消してしまったり やってはいけないことをやってそうで、不安なのです・・・。 上記のようなとき、NULLを代入しても大丈夫なのでしょうか?

  • newは明示的にした方が良いのか?

    インスタンス生成時、メモリを確保するためにnewします。 その時に疑問が生まれました。以下の書き方は何が違うのでしょうか。 そしてどちらが推奨されるのでしょうか? (1) newを明示的に実施 String str = new String(); str = "hoge"; (2) newは明示的にしない String str = "hoge";

    • ベストアンサー
    • Java
  • 用語/newを伴わないコンストラクタの呼出=関数?

    コンストラクタを勉強しているのですが、「用語」「意味」が分からないので、教えてください ■質問1 ・いついかなる時でも、「コンストラクタ関数」=「コンストラクタ」=「関数」=「メソッド」なのでしょうか? ・例えば、「newをつけずに、コンストラクタを関数として呼ぶ」場合も、「コンストラクタを実行する」と言うのでしょうか? ■質問2 … 「new」付与による相違 ・「new」付与しないと、「コンストラクタ」内で「this」が指し示す対象が異なる(グローバルオブジェクトになってしまう)のだと思うのですが、それ以外に何か相違点はあるのでしょうか? ・「new」付与しないとオブジェクトが正しく生成されないので、不具合が生じる可能性がある? ■質問3 ・「new」を付けずに、オブジェクトを関数として実行するのは、例えばどういう使い方をするときなのでしょうか?