游戏状态管理员,暂停和恢复

时间:2013-03-01 18:06:53

标签: c++ vector copy-constructor

我试图在游戏中暂停。目前,我有一个改变状态,运作良好。对于暂停我:

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%的时间它按预期工作lol,但其余的时间它崩溃。

该错误基本上表示,“很可能这是一个多线程客户端,而且还没有调用XInitThreads。

客户端不是多线程的;)..无论如何,有没有人有任何想法发生了什么?

1 个答案:

答案 0 :(得分:0)

那里有一些危险的代码。这样:

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

将使“currentState”指向不存在的对象,因为只有在nextState为STATE_INTRO时才会更新它:

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

这很可能是崩溃的原因。