通过 '*this' 传递副本时的奇怪行为
Posted
技术标签:
【中文标题】通过 \'*this\' 传递副本时的奇怪行为【英文标题】:Odd behavior when passing copy via '*this'通过 '*this' 传递副本时的奇怪行为 【发布时间】:2009-12-20 03:39:50 【问题描述】:最近我在我的游戏中实现了一个“暂停”屏幕。因为我希望它是一个单独的游戏状态,所以我需要以某种方式保存从玩家暂停游戏到重新进入游戏的数据。但是,当状态切换时,指向前一个状态的指针会被删除。
因此,我决定让 Paused 构造函数获取关卡(一个类)的副本,以便在用户决定恢复之前它可以保留它。然后它将使用复制的那个级别设置下一个状态。
将下一个状态设置为暂停的代码如下所示...
p_Game->SetNextState( new Paused( *this ));
不幸的是,当我输入暂停命令时,程序崩溃了。我调试了它,直到我发现问题似乎与 Level 类作为成员变量持有的老板的指针有关。游戏循环的运行方式,它首先处理事件,然后运行逻辑,然后渲染,如果已设置状态,它会更新到新状态。
每当对 Boss 指针执行操作时,程序就会崩溃,这发生在关卡的运行逻辑和渲染部分,但在游戏状态切换到暂停之前。注意,这个 Boss 指针在 Level 构造时分配,在销毁时释放。传递当前级别的副本是否会以某种方式混淆成员变量中保存的指针?
【问题讨论】:
看起来您正遭受指针成瘾的严重困扰。您是否真的试图收集尽可能多的内存泄漏?像这样构造代码有什么问题:game.SetNextState(Paused( *this ));
【参考方案1】:
您是否定义了一个实际的复制构造函数来深度复制 Level 对象、创建新的 Boss 对象等等?
还是你只是使用了编译器自动提供的,即浅拷贝?
如果是后者,那就是你遇到问题的地方:因为它是一个浅拷贝,新关卡中 Boss 对象的指针指向与你正在复制的关卡中相同的 Boss 对象...但是当您的原始关卡对象(不是副本,而是您制作副本的对象)破坏时,该 Boss 对象将被释放。
即使您编写了自己的构造函数,您仍可能需要确保执行的是深拷贝而不是浅拷贝。
更多关于拷贝构造函数:link
【讨论】:
以上是关于通过 '*this' 传递副本时的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章
通过 NSSecureCoding 解码 NSArray 时的奇怪行为
通过 RegQueryValueEx 和 RegGetValue 获取注册表值时的奇怪行为 [重复]