3

havokを使ってプログラミングをしていると、プログラム終了時にクラッシュしてしまい、

メイン関数を単純にするために havok 関数を C++ クラスにエンベロープし、クラスのデストラクタで havok quit 関数を呼び出しますが、「未処理の例外」クラッシュにつながる可能性があります。

ハボックのかなりの関数をデストラクタから取り出してメイン関数に入れれば大丈夫です。デストラクタでは機能せず、メイン関数で機能するのはなぜだろうか?

私のコードは次のとおりです。

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つのquit関数をクラスHKUTIのデストラクタに入れると、プログラムが終了しようとしたときにクラッシュします. その2つのアプローチの違いはわかりません。C++デストラクタで何が起こったのか教えてください。

どうもありがとう

4

2 に答える 2

1

Havokについては何も知りませんが、2つのquit関数を正確にこの順序で呼び出す必要があるようです。

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

したがって、2番目の呼び出しをHKUTIデストラクタに移動すると、最初に呼び出されます。両方の呼び出しを上記の順序でデストラクタに配置するか(HKUTI!のインスタンスが1つだけであることを確認する必要がある場合があります)、または下に移動しdelete myhk;ますhkBaseSystem::quit();

于 2011-01-24T20:05:15.090 に答える
0

まず、Intel のサイトにある Havok フォーラムは、Havok 固有の質問をするのに適した場所です。私たちの開発者サポートチームは定期的に返信します。

クラッシュのコールスタックは何ですか? 何が起こっているかについての私の推測では、hkBaseSystem::quit() を呼び出した後、HKUTI のデストラクタがいくつかの Havok オブジェクトをクリーンアップしていることです。すべての Havok クラスは new/delete 演算子をオーバーライドして、メモリ割り当てが hkMemorySystem のインスタンスを経由するようにします。したがって、hkBaseSystem::quit() の後に Havok オブジェクトが削除されると、hkMemorySystem::getInstance() が NULL を返すため、クラッシュが発生します。

それが役立つことを願っています。

于 2011-01-25T09:32:12.927 に答える