Havok завершил вызовы в деструкторе, вызвав необработанное исключение
Когда я программировал, используя havok, у меня происходил сбой при выходе из программы,
Я сделал envlope функциями havok для класса C++, чтобы упростить основную функцию, и я вызываю функции выхода havok в деструкторе моего класса, но это может привести к сбою "необработанного исключения".
Если я возьму из функции деструктора функцию havok и добавлю ее в основную функцию, все будет хорошо. Мне просто интересно, почему он не работает в деструкторе, а работает в основной функции?
мой код:
int HK_CALL main(int argc, const char** argv)
{
HKUTI *myhk = new HKUTI(setupPhysics, 1000);
myhk->run(displayGraphics, 60, 30);
delete(myhk);
myhk = NULL;
hkBaseSystem::quit();
hkMemoryInitUtil::quit();
return 0;
}
функция 2 havok quit - это hkBaseSystem::quit(); и hkMemoryInitUtil::quit(); если я вызову ее в функции main, как в коде выше, программа будет работать отлично, но если я добавлю эту функцию 2 quit в деструктор класса HKUTI, она будет аварийно завершена, когда программа попытается выйти. Я не вижу никакого отличия от этого подхода, может кто-нибудь сказать, что произошло в деструкторе C++?
Спасибо большое
2 ответа
Я ничего не знаю о Havok, но похоже, что вам нужно вызывать две функции quit именно в таком порядке:
hkBaseSystem::quit();
hkMemoryInitUtil::quit();
Так что, если вы переместите 2-й звонок в HKUTI
деструктор, это будет называться первым. Либо поместите оба вызова в указанном выше порядке в деструкторе (вы можете убедиться, что существует только один экземпляр HKUTI
!) или переместите delete myhk;
ниже hkBaseSystem::quit();
,
Прежде всего, форумы Havok на сайте Intel являются хорошим местом для вопросов, связанных с Havok. Наша команда поддержки разработчиков отвечает там регулярно.
Что такое колл-стэк аварии? Я предполагаю, что происходит, что деструктор HKUTI очищает некоторые объекты Havok после вызова hkBaseSystem::quit(). Все классы Havok переопределяют операторы new/delete, чтобы распределение памяти проходило через экземпляр hkMemorySystem. Поэтому, если объект Havok удаляется после hkBaseSystem::quit(), вы получите сбой, потому что hkMemorySystem::getInstance() вернет NULL.
Надеюсь, это поможет.