0

SDL を使用して C++ でゲームを作成しています。ゲーム実行関数を呼び出すだけのメイン関数があります。run game 関数はゲームを実行し、終了時に 0 を返す必要があります。私はすべての呼び出しの前後に物事を印刷しようとしましたが、リターン0でセグフォルトが発生するはずです。

functioncall()
{

   Loads of SDL and other stuff

   SDL_Quit();
   gamestatemanager.~Gamestatemanager();
   return 0; // This is probably where i get the seg fault
}
4

3 に答える 3

3

それが のデストラクタである場合、gamestatemanager明示的に呼び出す必要はありません。

オブジェクト システムがオブジェクトをクリーンアップするときに呼び出されます。

次のようなローカル変数として作成された場合:

Gamestatemanager gamestatemanager;

範囲外になるとクリーンアップされます。で割り当てられている場合newは、それを行う必要がありますdelete。その時点でクリーンアップされます。

ここでおそらく見つけているのは、デストラクタを自分で呼び出していることです。その後、オブジェクトがスコープ外になると、デストラクタが再度呼び出されます。それはうまく終わる可能性は低いです:-)

于 2013-06-18T12:35:37.740 に答える
0

オブジェクトのデストラクタは、そのオブジェクトがスコープ外になると自動的に呼び出されます。明示的に呼び出す必要はありません。

int functioncall()
{
   Gamestatemanager gamestatemanager;
   ... 
   SDL_Quit();
   return 0;
} // The destructors for all local objects are called.
于 2013-06-18T12:39:09.420 に答える
0

gamestatemanagerローカル変数だと思います。

そのデストラクタを明示的に呼び出してから、コンパイラがデストラクタを暗黙的に再度呼び出します ( function からの戻り時にスタックを「クリーンアップ」している間functioncall())。これにより、セグメンテーション違反が発生します。

取り除けgamestatemanager.~Gamestatemanager();ば大丈夫なはずです。デストラクタは、スタックのアンワイド中に暗黙的に呼び出されます。

于 2013-06-18T12:40:08.620 に答える