不删除指针?什么?这是如何运作的

时间:2015-05-25 01:42:30

标签: c++ pointers

这么长的故事,我正在为我的游戏编写代码而无法让它发挥作用。我正在初始化一些指针然后决定不删除我正在分配的指针,然后神奇地开始工作。到底是怎么回事?我非常困惑。

我决定摆脱指针的原因是因为我在这个链接上找到的代码。

Game State Machine - GameDevGeek

GameStatesMachine.h

#ifndef __GAMESTATESMACHINE_H__
#define __GAMESTATESMACHINE_H__

#include <vector>
#include <stdio.h>
#include "GameStates.h"

class GameStatesMachine
{
private:
    std::vector<GameStates *> data;

    GameStatesMachine() {};
    GameStatesMachine(GameStatesMachine const&);
    void operator=(GameStatesMachine const&);
    // you do not delete it this is for cleaning purposes
    ~GameStatesMachine()
    {
        while (!data.empty())
            pop_back();

        printf("GameEngine cleanup\n");
    }
public:
    static GameStatesMachine& Instance()
    {
        static GameStatesMachine g_instance;
        return g_instance;
    }

    void push_back(GameStates * state);
    void pop_back();
    void changeState(GameStates * state); 

    void render();
    void process();
    void update();
};

#endif

GameStatesMachine.cpp

#include "GameStatesMachine.h"

void GameStatesMachine::push_back(GameStates * state)
{
    if (!data.empty())
        data.back()->pause();
    data.push_back(state);
    data.back()->onEnter();
}

void GameStatesMachine::pop_back()
{
    if (!data.empty()) {
        data.back()->onExit();
        data.pop_back();
    }
    if (!data.empty())
        data.back()->resume();

}

void GameStatesMachine::changeState(GameStates * state)
{
    if (!data.empty())
        pop_back();
    push_back(state);
}

void GameStatesMachine::render()
{
    data.back()->render();
}

void GameStatesMachine::process()
{
    data.back()->process();
}

void GameStatesMachine::update()
{
    data.back()->update();
}

1 个答案:

答案 0 :(得分:3)

我看了一下链接中的示例代码。基本上我认为这可归结为对何时需要调用删除的误解。

基本上,您只需在使用new时调用delete。链接中的示例代码都不使用new,而是引擎推送并弹出静态状态:

class CPlayState : public CGameState
{
    static CPlayState* Instance() {
        return &m_PlayState;
    }

    // other code

private:
    static CPlayState m_PlayState;
}

如何使用CPlayState:

void CIntroState::HandleEvents(CGameEngine* game)
{
    // other code.
    game->ChangeState( CPlayState::Instance() );
}

基本上,游戏引擎推送并弹出这些静态状态,而不是调用new来实例化它们。由于该对象未使用new创建,因此您不能在其上调用delete。由于它们是静态的,因此在您的流程退出时会清除它们。

有更好的资源来学习C ++范围逻辑和对象生命周期,我建议去Google查找它们。