dポイントプレゼントキャンペーン実施中!

C++にて要素数が不定の配列のクラスをnewで生成します。
このとき、newで一度に全ての配列を生成するとメモリをかなり取るので、
指定された要素番号のみを生成したいのでダブルポインタにし、
全体を生成してから個別にクラスを生成することで、
思い通りの処理ができるようになりました。
(生成する番号は0→1→2みたいな順列ではないため)

しかし、ここで1つ問題が発生しました。
まずは以下にそのソースを示します。

-----------------------------
class CHOGE {
  inta;
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を代入しても大丈夫なのでしょうか?

A 回答 (4件)

> 上記のようなとき、NULLを代入しても大丈夫なのでしょうか?



大丈夫です。

ところで、

p[0] = new CHOGE();

または

p[0]->print(); // ←OK

に失敗して例外が送出された場合、このプログラムではメモリリークが発生します。
pは、newで割り付けるより、std::vectorを使うなどした方が安全です。
    • good
    • 0

いや,


CHOGE **p = new CHOGE*[3];
をやったあとで p[0] に入っているゴミが NULL じゃなかった, ということではないかな>#1.
ここに入っていた値はただのゴミなので NULL を代入するのは問題ありません.
    • good
    • 0

動的確保の



CHOGE **p = new CHOGE*[3];

は,静的確保にすると

CHOGE *p[3];

と,同じことですね.
CHOGEへのポインタを3つ含む配列が確保されていますが
C++言語の場合,領域を確保するときに初期化を行わないので
配列のそれぞれの要素が何を指しているかは不定です.

ポインタ自体は3つ確保されているのでそこにNULLを代入しても問題ないですよ.
    • good
    • 0

>CHOGE **p = new CHOGE*[3];


この時点で p[3] で確保されるからnullではない、というオチじゃない?

分解すると こうだよね?
CHOGE **p = {CHOGE*[0],CHOGE*[1],CHOGE*[2]}

よって
p[0]=&(CHOGE*[0]);
p[1]=&(CHOGE*[1]);
p[2]=&(CHOGE*[2]);
だからnullじゃないのでは・・・
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!