読者です 読者をやめる 読者になる 読者になる

くれなゐの雑記

身の回りの人や自分が困っていたことを記事にしています

配列外参照の対策(C++)

さて、たまにはプログラムについてのことも

大規模なコーディングをしているときに気をつけていても時々起きてしまう配列外参照(私だけかもしれませんが

エラー吐いてくれたらまだいいですが、メモリの確保量が多くなると配列外参照で参照した値が偶然存在し、そこの値を変数に代入したり、また、その何か分からない値の変数を書き変え、しかもそれが気付かれず、メモリリークしてしまうこともあります。

ポインタならスマートポインタ(uniqueポインタなど)を使えばある程度は対処できますが、配列外参照でちゃんとエラーをはくようにすると

.at()

など使わないといけなかったりと少々面倒。しかもstdのエラーわかりづらい!

そこで配列を定義するとき、std::array<>のラッパクラスを作り、operator []でアクセスするときにデバッグ時のみ配列外参照の検出を行い、try-catchするなり、メッセージボックス出すなり、ブレークポイント設置(VS)するなりして対策してはいかがでしょうか?

ちなみに.at()はRelease時にも配列外参照するための判定をしているそうなので、ひょっとするとその分動作が遅くなってるかもしれません。(未確認、未検証)今度暇があれば簡単に検証してみる予定です。ついでにその時に今日の記事のコードも書いてみます。