• ベストアンサー

オブジェクトの生成

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

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

  • ベストアンサー
  • nitscape
  • ベストアンサー率30% (275/909)
回答No.2

newを使いたい、ということなのでしょうか?必要がなければ使わなくてもいいかと思います。newをしたらdeleteが必要になり。忘れるとメモリリークが起きますので。 newは基本なのでバッチ処理でもクライアント/サーバ系でも必要なときは必要になります。しかしclassをうまく使えばnew/deleteをクラスにまかせて自分でやらなくてもいいプログラミングをすることも可能です(MFCであればCStringやCArray、CMapなどです)。 newを使うのは。。。 ■データが大きいときや必要サイズが可変するとき データの大きさが明らかであってもそのサイズが大きすぎるときには動的に確保する必要があります。 ■メモリを効率よく使いたいとき 例えばユーザーに文字を入力させるとき最大が255文字となっていれば最初から256文字のメモリを用意して使えばいいですが、1文字しかなくても256バイト(もしくはその2倍)が必要になります。1文字であればnewで2バイト(もしくは3バイト)確保したほうが効率がいいですよね。 ■データが消えてはこまるとき newで確保したものはdeleteをするまでは消えません。(そのため少なくとも私は)マルチスレッドプログラミングではnewを多用しています。 newで確保したメモリをコピーしてほかのスレッドに飛ばし、そのスレッドでメモリを利用してdeleteする、という使い方です。 ■newでないとできないとき class CCC { public:   CCC(int n); ... }; というようなオブジェクトがあったとします。これをほかのクラスで使うときには... class FFF {   CCC  m_c(999); }; CCCのコンストラクタに数値を渡す必要があります。しかし999のように固定した数値で渡すしかないので   CCC  m_c(nIndex); のように変数で初期化しようとするとエラーになります。変数に格納した動的な数値でメンバを初期化したいときは class FFF {   CCC*  m_pC; public:   FFF(){m_pC=NULL;}   ~FFF(){if(m_pc==NULL)delete m_pC;}   void init(n)   {     if(m_pC != NULL)      delete m_pC;     m_pC = new CCC(n);   } }; のようにして、newをつかわざるをえません。

jun_j
質問者

お礼

有難うございます。大変参考になりました。

その他の回答 (1)

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.1

>Cではバッチ処理の開発を主に行ないましたが、 とありますが、malloc()や類似のAPIを使用したことはありませんか? C++のnewも基本的に同じ事です。 プログラムが扱うデータのサイズは、一般的には実行時になって明らかになります。 実行時になるまでデータサイズがわからない場合のアプローチとしては次の2種類があります。  (1)十分大きい領域を確保しておく  (2)データ領域を動的に確保する。 (1)の場合はデータによっては無駄にメモリを消費することになりますが、 (2)の場合は必要な分だけを確保することができますし、不必要になったら開放することもできます。 C++で(2)の方法を選択する場合、普通はnew演算子を使います。 また、スタックオーバーフローを防ぐためにnewする場合もあります。 この辺もCでのmalloc()と同様です。

jun_j
質問者

お礼

有難うございます。 私の動的メモリの理解が不足していました事が原因なのですね。

jun_j
質問者

補足

早速のご回答有難うございます。 malloc()も使用した事がありません。 結局の所、バッチでは プログラムが扱うデータ(ファイルは) 実行前に明らか?で私の開発経験の範囲では、 動的に確保するという必要がありませんでした。 宜しければ、もう少し具体的な例などお教え願えないでしょうか? 実は、今回初めて、マルチスレッドのサーバAPを開発に関わる予定ですので、その辺に絡めていただけると幸いです。

関連するQ&A