|
カテゴリ:IT
ここ数日,後輩が悩んでいた.
どうもネットの何処かから,こんなコードを引っ張ってきったらしい. 注:以下のコードは動きません double* a = new double [x,y]; で,ちゃんと動かないとのことで相談を受けたのだ.私は,new doubleの後ろのカッコ内に2つ値を書く表記法を初めて見たので面食らった. 以前私も同じ問題に取り組んだことがあったので(そのときはC++でなくC言語という指定だったが),すぐ回答することができた. ふつうこういう風にすると思うのだが(解放のほうもつけた). double** a = new double* [x]; for( int i=0; i<x; i++ ){ a[i] = new double [y]; } for( int i=0; i<x; i++){ delete [] a[i]; } delete [] a; ついでに私も調べてみたが,カッコ内に2つ値を書く表記法には行き当たらなかった.まぁこれに関しては,そんなコードを載せたほうにも,それを鵜呑みにしたほうにも責任がある(一応「私に相談した=自分でチェックして,疑問に思った」わけだし,後輩なので無罪放免).なので,私が一応正解として書いた上のコードも,ちゃんと確認してから使っていただきたい. ついでに書くと,私の経験では,熟達した(と自分で思っているか,周りが思っているか,その両方)技術者ほど,動的確保したメモリの解放や,オープンしたファイルをクローズしないコードを書く傾向がある.たしかに言語の仕様としては,そういうものはプログラム終了時に自動的に解放なりクローズなりしてくれることになっているのだが,私は以下の理由でこれらの処理は明示的にコードを書くべきだと思う. 1.確保と解放,オープンとクローズは対応するものだから,明示的に書いた方がバランスがいいし読みやすい. 2.特に,他の人がそのコードを見たとき「何か理由があって解放してないのでは?」などの余計な心配や誤解をする恐れがなくなる. 3.言語仕様としてはそうでも,肝心のコンパイラが仕様通りに出来ているとは限らない.実際,同じ後輩からの相談で,ファイルをちゃんとクローズしただけでバグが直ったケースがある. 更に蛇足だが,「私が以前経験した」というのは実は2次元配列だけではなく,4次元までの配列の確保・解放なのだ.空間3次元+時間1次元のデータを全部読み込むためにそういうものを作ったのだ.もう2度とやりたくないから,ちゃんと関数の形にしておいてある. お気に入りの記事を「いいね!」で応援しよう
Last updated
2007.11.23 11:10:43
[IT] カテゴリの最新記事
|