- ベストアンサー
newとdelete
動的にaaa[5][40]という配列を作りたいのですけど,以下のプログラムでよろしいでしょうか? aaa = new double *[5]; for(int p = 0; p < 5; p++){ aaa[p] = new double [40]; } また,これをdeleteするときはどのようにすればよろしいのでしょうか? どうぞよろしくお願いいたします.
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
for(int p = 0; p < 5; p++){ delete aaa[p]; } delete aaa;
その他の回答 (2)
- floor101
- ベストアンサー率28% (2/7)
気になったので補足しておきます。 ご質問の方法は確かによく使われるので、わざわざ 見にくい二次元配列的な確保をしなくても良いかも しれません。 ただ、関数の引数に渡す時の受け方が異なります。 ポインタのポインタ: func(double** p); 配列へのポインタ: func(double[][40); もしくは func(double(*)[40]); ポインタのポインタ方式は、行によって列の長さを可 変できる利点があり、配列へのポインタは、アドレス をより速く計算できる利点があります。 std::vectorを用いても構わないのであれば、 std::vector<std::vector<double> > vva(5, std::vector<double>(40)); のようにすれば、解放が不要となります。また、確保 後、行や列の数を後から変更する自由度も増えます。 欠点としては、やや効率が悪くなる事です。
お礼
早速の回答,ありがとうございました. vectorは近々使っていきたいと思っております. また質問する時があると思いますが,その時はどうぞよろしくお願いいたします.
- floor101
- ベストアンサー率28% (2/7)
あまり美しくないキャストを伴いますが。 double (*aaa)[40] = reinterpret_cast<double(*)[40]>(new double[5 * 40]); delete[] aaa; ご質問の方法ですと、ポインタのポインタという形に なり、厳密な二次元配列とは異なります。大抵のコン パイラでは、生成されるバイナリも異なると思います。
お礼
早速の回答,ありがとうございました. 大変参考になりました.