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 именно в таком порядке:

  1. hkBaseSystem::quit();
  2. 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.

Надеюсь, это поможет.

Другие вопросы по тегам