0

ゲームの一時停止を許可しようとしています。現在、私はうまく機能する変更状態を持っています。私が持っている一時停止のために:

void PushState(int newState)
{
    pauseID = stateID; ///save state number

    Gstates.push_back(currentState); ///Set Current state to vector

    nextState =  newState; ///acquire new state

    switch( nextState )
    {
    case STATE_INTRO:
        currentState = new CIntroState(); ///create new state
        break;
    }

    //Change the current state ID
    stateID = nextState;

    //NULL the next state ID
    nextState = STATE_NULL;
}

上記の部分はうまくいくようです。

これは私の履歴書セクションです

void Resuming()
{
    nextState = pauseID;

    if( nextState != STATE_EXIT )
    {
         delete currentState; ///deletes current state
    }

    switch( nextState )
    {
    case STATE_INTRO:
        currentState = Gstates.back(); ///sets current state to the saved state
        Gstates.pop_back(); ///delets saved state 
        break;
    }

    //Change the current state ID
    stateID = nextState;

    //NULL the next state ID
    nextState = STATE_NULL;
}

奇妙なマルチスレッドエラーが発生します。約 50% の場合は意図したとおりに動作しますが、残りの時間はクラッシュします。

エラーは基本的に、「これはマルチスレッド クライアントであり、XInitThreads が呼び出されていない可能性が高いです。

クライアントはマルチスレッドではありません;)..とにかく、何が起こっているのか誰か知っていますか?

4

1 に答える 1

0

危険なコードがあります。これ:

if( nextState != STATE_EXIT )
{
     delete currentState; ///deletes current state
}

nextState が STATE_INTRO の場合にのみ更新されるため、「currentState」は存在しないオブジェクトを指すままになります。

switch( nextState )
{
case STATE_INTRO:
    currentState = Gstates.back(); ///sets current state to the saved state
    Gstates.pop_back(); ///delets saved state 
    break;
}

これがクラッシュの原因である可能性が非常に高いです。

于 2013-03-01T18:20:50.340 に答える