在其成员函数返回之前,将对象删除是不确定的行为吗?
Is it undefined behavior to have an object be deleted before its member function returns?
可能的重复:
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);
}
};
请注意,如果状态对象在更新方法中调用StateManager :: SetState,则会在一段时间内调用成员函数在刚刚被破坏的对象上。
此行为的一个完整示例是在http://ideone.com/whlzjl上。请注意,在FirstState ::更新返回之前,如何调用FirstState的破坏者。
这种不确定的行为是C 吗?如果是这样,我应该如何更改设计?
不,没关系,如果您小心:
没有问题,这是您在功能中所做的最后一件事。(delete this
是一个常见的成语。)在这种特殊情况下,我通常认为State::update
最好返回新的State
(可以是this
)。然后,在StateManager
中调用它的代码将简单地将其分配给指针。
在这种情况下,请注意智能指针的语义。我使用侵入性共享指针进行了操作,但我怀疑当前的大多数智能指针都会在这里失败。另一方面,您在这里真的不需要明智的指针,所以为什么要添加复杂性。
据我所知,主要效果是this
成为一个悬空的指针,因此访问字段,调用virtual
方法或执行依赖运行时类型信息的dynamic_cast<T*>(this)
之类的事情将结果在未定义的行为中。
相关文章:
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 不确定如何装饰我的C++库代码以在 C 中使用
- C++功能泄漏内存,我是C++新手,不确定如何解决
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 为什么以下代码是不确定的?
- 创建模板类型而不新建/删除
- 编译错误:"lvalue required as left operand of assignment" 不确定原因
- 误用指针会产生分段错误。我仍然不确定如何纠正它
- 我不确定为什么代码没有运行,它在编译时抛出错误,说它无法找到 PrintArray()
- 不确定出了什么问题(字符串输入)
- C++睡眠时间不确定
- C++ 如何使我的程序不会删除正在使用的文件?
- 在C++中做一个场景问题,我不确定如何处理布尔和if循环
- C++ 链表:它不会删除第一个输入
- 所以我想出了他的代码,但我不确定如何继续删除功能?
- 为什么在const和非const方法中删除代码重复不是不确定的行为
- 在其成员函数返回之前,将对象删除是不确定的行为吗?
- 我想从这段代码中删除使用命名空间std,但我不确定什么都需要用std::作为前缀