572305 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

t-cross Private Research Institute (tPRI)

t-cross Private Research Institute (tPRI)

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

Calendar

Profile

t-cross

t-cross

Category

Archives

2024.06
2024.05
2024.04
2024.03
2024.02
2007.11.23
XML
カテゴリ: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



© Rakuten Group, Inc.