2011-01-24 22 views
3
私はハボックを使用してプログラミングする場合、プログラムが終了したときに、私はクラッシュを得た

、私は主な機能を簡単にするためにC++クラスにHavokの機能をenvlope持っHavokは未処理の例外

を引き起こしデストラクタ中のコールを終了し、私は呼んで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ハボックは機能がhkBaseSystemで終了::()を終了し、およびhkMemoryInitUtil :: quit(); 上記のコードのようなmain関数で呼び出すと、プログラムは完全に実行されますが、2つの終了関数をHKUTIクラスのデストラクタに置くと、プログラムが終了しようとするとクラッシュします。私はその2つのアプローチのいずれかを参照してくださいすることはできません誰もがC + +のデストラクタで何が起こったのか教えてください?非常に多くの

おかげ

答えて

1

私はHavokについては何も知りませんが、あなたが2が正確にその順序で関数を終了呼び出す必要が表示されます。

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

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

0

最初に、Havok forums at Intel's siteは、Havok固有の質問に適しています。私たちの開発者サポートチームは定期的に返信します。

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

希望に役立ちます。

+0

ありがとう、あなたのアドバイスは本当に役に立ちます。 –