Я получаю плохую ошибку. Когда я вызываю delete для объекта в верхней части иерархии объектов (в надежде на причину удаления его дочерних объектов), моя программа завершает работу, и я получаю следующее:
*** glibc detected *** /home/mossen/workspace/abbot/Debug/abbot: double free or corruption (out): 0xb7ec2158 ***
, за которым следует что-то вроде дампа памяти. Я искал эту ошибку, и, судя по всему, она возникает, когда вы пытаетесь удалить уже удаленную память. Это невозможно, так как в моем коде есть только одно место, которое пытается это удалить. Вот дурацкая часть: это не происходит в режиме отладки. Код в вопросе:
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;
}
Может быть, это связано с возвратом указателя, инициализированного в пространстве стека статического метода? Я делаю удаление правильно? Любые другие советы о том, что я мог бы проверить или сделать лучше?