3

当我使用 havok 编程时,程序退出时我遇到了崩溃,

我将 havok 函数封装到 C++ 类中以简化主函数,并在类的析构函数中调用 havok 退出函数,但这可能会导致“未处理的异常”崩溃。

如果我从析构函数中取出havok的相当函数,放到main函数中就可以了。我只是想知道为什么它在析构函数中不起作用但在主函数中起作用?

我的代码是:

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退出函数是hkBaseSystem::quit(); 和 hkMemoryInitUtil::quit(); 如果我像上面的代码那样在主函数中调用它,程序将完美运行,但是如果我将那个 2 退出函数放在 HKUTI 类的析构函数中,当程序试图退出时它会崩溃。我看不出这两种方法有什么不同,谁能告诉我 C++ 析构函数中发生了什么?

非常感谢

4

2 回答 2

1

我对 Havok 一无所知,但您似乎需要完全按照该顺序调用两个退出函数:

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

因此,如果您将第二个调用移动到HKUTI析构函数中,它将首先被调用。要么按照上面的顺序在析构函数中放置两个调用(您可能需要确保只有一个HKUTI! 的实例),或者移动delete myhk;下面的hkBaseSystem::quit();.

于 2011-01-24T20:05:15.090 回答
0

首先,英特尔网站上的 Havok 论坛是解决 Havok 特定问题的好地方。我们的开发人员支持团队会定期回复。

崩溃的调用堆栈是什么?我对发生的事情的猜测是,在您调用 hkBaseSystem::quit() 之后,HKUTI 的析构函数正在清理一些 Havok 对象。所有 Havok 类都会覆盖 new/delete 运算符,以使内存分配通过 hkMemorySystem 的实例进行。因此,如果在 hkBaseSystem::quit() 之后删除了 Havok 对象,则会发生崩溃,因为 hkMemorySystem::getInstance() 将返回 NULL。

希望有帮助。

于 2011-01-25T09:32:12.927 回答