日記
2013/01/06
ヒープ破壊とリビルドの話
先日、C++でプログラムいじってたら突然「ヒープ破壊」とかいうエラーが出てしまった。
「ヒープ破壊」とは一般的に、確保したメモリ以外の場所に書き込もうとしたときに出るエラーで、
大抵の場合、ポインタや配列を使っている箇所を調べれば原因が分かるはずなのだが、
今回はちょっと様子が違う。というのもエラーの状況というのがこんなかんじ。
○自作のクラスである「オブジェクトクラス」と「キャラクラス」があり、
「キャラクラス」は「オブジェクトクラス」を継承している。
○「オブジェクトクラス」に変数を追加するとエラーがでる。
つまり、ポインタとかは一切いじっておらず、変数を追加しただけでエラーになるのである。
なんとも不可解な、これは妖怪の仕業に違いないと思ったが、
これを解決しないと先に進めないのでいろいろ試す。が、直らない。
で、たまに直ったかと思ったら、またエラーになったりするもんだから大混乱。
そんで、ヤケクソでリビルドしてみたら、なぜか直った。
なぜ直ったのだろうか?あくまでも憶測だが、こういうことではなかろうか?
○「オブジェクトクラス」は「オブジェクトヘッダー」に定義してある。
○「オブジェクトクラス」に変数を追加し、ビルドすると、
「オブジェクトヘッダー」のみがビルドされる。
○その結果、他のファイルがビルドされず、古いほうのオブジェクトヘッダーを参照したままになる。
(ここがよく分からない。古いほうのオブジェクトヘッダーとは何か?どこにあるのか?なぜそうなるのか?)
○古いほうのオブジェクトヘッダーを参照しているので、新しく追加した変数を認識できてない→エラー
何かよく分からないけど、直ったからまぁいいか。
日記トップへ