• ベストアンサー

newとdelete

動的にaaa[5][40]という配列を作りたいのですけど,以下のプログラムでよろしいでしょうか? aaa = new double *[5]; for(int p = 0; p < 5; p++){ aaa[p] = new double [40]; } また,これをdeleteするときはどのようにすればよろしいのでしょうか? どうぞよろしくお願いいたします.

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

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

for(int p = 0; p < 5; p++){ delete aaa[p]; } delete aaa;

graduate_student
質問者

お礼

早速の回答,ありがとうございました. 大変参考になりました.

その他の回答 (2)

  • floor101
  • ベストアンサー率28% (2/7)
回答No.3

気になったので補足しておきます。 ご質問の方法は確かによく使われるので、わざわざ 見にくい二次元配列的な確保をしなくても良いかも しれません。 ただ、関数の引数に渡す時の受け方が異なります。 ポインタのポインタ: func(double** p); 配列へのポインタ: func(double[][40); もしくは func(double(*)[40]); ポインタのポインタ方式は、行によって列の長さを可 変できる利点があり、配列へのポインタは、アドレス をより速く計算できる利点があります。 std::vectorを用いても構わないのであれば、 std::vector<std::vector<double> > vva(5, std::vector<double>(40)); のようにすれば、解放が不要となります。また、確保 後、行や列の数を後から変更する自由度も増えます。 欠点としては、やや効率が悪くなる事です。

graduate_student
質問者

お礼

早速の回答,ありがとうございました. vectorは近々使っていきたいと思っております. また質問する時があると思いますが,その時はどうぞよろしくお願いいたします.

  • floor101
  • ベストアンサー率28% (2/7)
回答No.2

あまり美しくないキャストを伴いますが。 double (*aaa)[40] = reinterpret_cast<double(*)[40]>(new double[5 * 40]); delete[] aaa; ご質問の方法ですと、ポインタのポインタという形に なり、厳密な二次元配列とは異なります。大抵のコン パイラでは、生成されるバイナリも異なると思います。

関連するQ&A

専門家に質問してみよう