悪いエラーが発生します。オブジェクト階層の最上位にあるオブジェクトに対してdeleteを呼び出すと(子オブジェクトが削除されることを期待して)、プログラムが終了し、次のようになります。
***glibcが検出されました***/home / mossen / worksheet / abbot / Debug / abbot:ダブルフリーまたは破損(出力):0xb7ec2158 ***
続いて、ある種のメモリダンプのように見えます。私はこのエラーを検索しましたが、私が収集したものから、すでに削除されているメモリを削除しようとすると発生するようです。この削除を試みるコードには1つの場所しかないため、不可能です。ここに奇妙な部分があります:それはデバッグモードでは発生しません。問題のコード:
Terrain::~Terrain()
{
if (heightmap != NULL) // 'heightmap' is a Heightmap*
{
cout << "heightmap& == " << heightmap << endl;
delete heightmap;
}
}
ハイトマップデストラクタのすべてをコメントアウトしましたが、それでもこのエラーが発生します。エラーが発生した場合、
heightmap&== 0xb7ec2158
印刷されます。デバッグモードでは、コードをゆっくりとステップスルーできます。
heightmap&== 0x00000000
が印刷され、エラーはありません。'ハイトマップの削除;'をコメントアウトすると 行、エラーは発生しません。上記のデストラクタは、別のデストラクタから呼び出されます(個別のクラス、仮想デストラクタなどはありません)。ハイトマップポインタは、次のようなメソッドで新しく追加されました。
Heightmap* HeightmapLoader::load() // a static method
{
// ....
Heightmap* heightmap = new Heightmap();
// ....other code
return heightmap;
}
静的メソッドのスタックスペースで初期化されたポインタを返すことと関係があるのでしょうか?削除は正しく行っていますか?私がチェックしたり、より良くしたりできることに関する他のヒントはありますか?