4

可能重复:
C++:删除这个?

我正在尝试创建一个系统来管理游戏的状态。

我当前设计的问题是,当我切换状态时,旧状态会在控制切换到新状态之前被删除。

以下是我的代码的简化版本:

class StateManager;

class State
{
public:
    virtual void update(StateManager &manager)= 0;
    virtual ~State(){}
};


class StateManager
{
public:
    void setState(std::unique_ptr<State> && newState )
    {
        currentState = std::move(newState);
    }
    std::unique_ptr<State> currentState;

    void run()
    {
        currentState->update(*this);
    }
};

请注意,如果 State 对象在 update 方法中调用 StateManager::setState 时,将有一段时间在刚刚销毁的对象上调用成员函数。

此行为的完整示例位于http://ideone.com/WHLzJL。请注意在 FirstState::update 返回之前如何调用 FirstState 的析构函数。

这是 C++ 中未定义的行为吗?如果是这样,我应该如何改变我的设计?

4

3 回答 3

7

不,没关系,如果你小心的话:https ://isocpp.org/wiki/faq/freestore-mgmt#delete-this

于 2012-11-02T23:10:00.457 回答
2

只要没有问题,这是您在函数中做的最后一件事。(delete this是一个常见的习惯用法。) 然而,在这种特殊情况下,我通常发现最好State::update返回新的State(可能是this)。然后,调用它的代码StateManager将简单地将其分配给指针。

在这种情况下,请注意智能指针的语义。我使用侵入式共享指针来做到这一点,但我怀疑大多数当前的智能指针在这里都会失败。另一方面,您在这里并不需要智能指针,所以为什么要添加复杂功能。

于 2012-11-02T23:21:30.160 回答
0

据我所知,主要影响是this成为一个悬空指针,因此访问字段、调用virtual方法或执行dynamic_cast<T*>(this)依赖运行时类型信息的类似操作会导致未定义的行为。

于 2012-11-02T23:12:16.847 回答