Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted.

Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted.

VC7でデバッグを掛けると、このエラーが起きる事がある。
エラーの意味としては、変数「xxx」のあたりのスタックが破壊されていますよ。というものだと思います。
原因はいくつか考えられる。

1つは、その変数や、そのあたりの変数にアクセスしたときに、確保した領域を超えて書き換えてしまった場合とか。
例えば、
char xxx[10];
xxx[10] = 'c'; // インデックス9までしか確保されていない

こんな場合。
これだったら、話は早いんだけど、実際にはインデックスが計算で算出されていたり、ポインタの計算だったりと、意外とハマる事が多い。

もう一つは、クラスなどを更新したときに、サイズや定義が変わったのに、IDEが変更に気づいてくれない事がある。
気づいてくれないと、そのクラスを使用しているコードが再コンパイルされないので、おかしなことになる。
例えば、クラスに変数を1つ追加したけど、IDEが気づいてくれず、そのクラスを使用しているコードが再コンパイルされないと、そこコードの部分では、古いクラス(データの並び)として扱われてしまう。
その結果、必要なメモリ領域が確保できなかったり、変数の一部が初期化されていなかったり、アライメントがずれてしまったり。。。
いろいろな問題が起こる。
プログラマがその状態をデバッガで確認すると、「なぜか訳が分からない値になる」ことしか分からない。
引数としてクラスを渡すと、正しく設定してあるはずなのに、関数に入った途端意味不明なデータになってしまう。
プログラム上では正しいはずにもかかわらず、何度やっても、おかしい。
(自分の頭が狂ってしまったのかと、半狂乱する事もある ^^;)
そんなときは、この問題の可能性が高い。
狂っているのは、IDEとコンパイラ。
プログラム全体をリビルドすると、問題が解決する事が多い。
[PR]
by isoq | 2005-05-17 10:20 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< PocketPC + HMD ... 今日も午前中に病院へ >>