• ベストアンサー

newでの動的生成について

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

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

  • ベストアンサー
  • 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