最近我在游戏中实现了“暂停”屏幕。由于我希望它是一个单独的游戏状态,我需要以某种方式保存从玩家暂停游戏到重新进入时的数据。但是,当切换状态时,将删除指向先前状态的指针。
因此,我决定让Paused构造函数获取Level(一个类)的副本,以便它可以保留它直到用户决定恢复。然后它将使用复制的Level设置下一个状态。
将下一个状态设置为暂停的代码看起来像这样......
p_Game->SetNextState( new Paused( *this ));
不幸的是,当我输入命令暂停时,程序崩溃了。我调试了它,直到我发现问题似乎与Level类作为成员变量持有的指向老板的指针有关。游戏循环的操作方式,它首先处理事件,然后运行逻辑,然后渲染,如果已设置状态,它将更新为新的。
每当对Boss指针进行操作时程序就会崩溃,这在Level的运行逻辑和渲染部分期间发生,但在游戏状态切换为暂停之前。注意,这个Boss指针在Level构造时分配,并在销毁时释放。可以传递一个当前Level的副本某种方式弄乱指针保存在成员变量中吗?
答案 0 :(得分:7)
您是否定义了一个实际的复制构造函数,它深度复制了Level对象,创建了一个新的Boss对象,等等?
或者您只是使用编译器自动提供的那个,这是一个浅层副本?
如果是后者,那就是你遇到问题的地方:因为它是一个浅层副本,新级别中Boss对象的指针指向与你正在复制的级别相同的Boss对象...但是当你的原始关卡对象(不是副本,而是你制作副本的对象)破坏时,Boss对象会被释放。
即使您编写了自己的构造函数,您仍可能需要确保执行深层复制而不是浅复制。
有关复制构造函数的更多信息:link