Havok завершил вызовы в деструкторе, вызвав необработанное исключение - PullRequest
3 голосов
/ 24 января 2011

Когда я программировал с использованием havok, при завершении работы программы возникал сбой,

Я включил функции 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 ]

1 голос
/ 24 января 2011

Я ничего не знаю о Havok, но, похоже, вам нужно вызвать две функции выхода именно в таком порядке:

  1. hkBaseSystem::quit();
  2. hkMemoryInitUtil::quit();

Таким образом, если вы переместите второй вызов в деструктор HKUTI, он будет вызван первым.Либо поместите оба вызова в указанном выше порядке в деструкторе (вы можете убедиться, что существует только один экземпляр HKUTI!), Либо переместите delete myhk; ниже hkBaseSystem::quit();.

0 голосов
/ 25 января 2011

Прежде всего, форумы Havok на сайте Intel являются хорошим местом для вопросов, связанных с Havok.Наша команда поддержки разработчиков отвечает там регулярно.

Что такое колл-стэк аварии?Я предполагаю, что происходит, что деструктор HKUTI очищает некоторые объекты Havok после вызова hkBaseSystem :: quit ().Все классы Havok переопределяют операторы new / delete, чтобы распределение памяти проходило через экземпляр hkMemorySystem.Поэтому, если объект Havok удаляется после hkBaseSystem :: quit (), вы получите сбой, потому что hkMemorySystem :: getInstance () вернет NULL.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...