当指针指向的对象被另一个类的实例删除时重新分配指针

Posted

技术标签:

【中文标题】当指针指向的对象被另一个类的实例删除时重新分配指针【英文标题】:Reassigning a pointer when the object it is pointing to is deleted by an instance of another class 【发布时间】:2019-05-21 10:58:09 【问题描述】:

我正在创建一个塔防游戏模型,其中敌人试图在被摧毁之前穿过屏幕。

指向动态分配的 Enemy 对象的指针存储在 EnemyManager 类内的向量中,该类控制它们如何生成和消失。当 Enemy 的生命值为零时,EnemyManager 会使用deleteerases 指针将其删除。

我有一个 BulletTower 对象,用于锁定单个敌人并射击直到它被摧毁,然后锁定另一个。这需要一个指向 Enemy 对象的指针,但如果 Enemy 死亡并被 EnemyManager 删除,则指针悬空。

指针似乎无法判断被锁定的敌人是否被摧毁。我研究了智能指针,但似乎共享指针不起作用,因为当敌人的生命值达到零时会被手动删除。

【问题讨论】:

如果您将 共享指针 存储到 EnemyManager 中,您可以为被 @987654325 锁定的特定 Enemy 创建一个 弱指针 @。然后,该弱指针可以让您找出该敌人是否仍然存在(并且不会阻止敌人被杀死-删除)。 感谢您的回复!但是,对 Enemy 对象创建 shared_ptr 不会阻止我在它们的生命值达到零时手动删除它们吗?编辑:或者是reset的解决方案是在健康到零时共享指针导致对象被删除? 不要手动删除它们,只需从EnemyManager 中删除共享指针。共享指针的删除器将为您删除敌人。我不知道细节,因为您没有显示任何代码如何将敌人存储在管理器中(可能在向量或列表中?)。 谢谢,有道理! (我确实提到它们存储在帖子中的向量中,我会提供代码,但我可以添加的内容不多,以澄清过去的内容) 对不起,我忽略了这些信息,我的错。无论如何,当您从向量中删除共享指针时,指向的敌人会自动删除。 【参考方案1】:

您可以将指向实际Enemy 对象的指针存储在变量中。并且有一个指向 BulletTower 对象的这个指针变量的指针。当Enemy 被杀死时,EnemyManager 可以将变量更改为nullptrBulletTower 对象可以通过它拥有的指针来检查这个事实。

所以本质上,BulletTower 锁定的是指针变量,而不是直接锁定 Enemy 对象。

保持计数有多少BulletTower 对象已锁定到Enemy。不要删除 Enemy,除非该计数变为 0。对于 BulletTower,当能量变为 0 时解除锁定并减少锁定计数。

【讨论】:

【参考方案2】:

Weak pointer 或许可以胜任。

此外,您可以提供一个函数或对象,如果它还活着,则返回当前锁定的敌人,或者返回一个新的,而不是提供指向 BulletTower 的 Enemy 指针。

【讨论】:

第二个建议不起作用,因为 BulletTower 决定锁定哪个敌人(应该在我的帖子中澄清),但弱指针完成了这项工作!

以上是关于当指针指向的对象被另一个类的实例删除时重新分配指针的主要内容,如果未能解决你的问题,请参考以下文章

删除指向子类的指针会调用基类析构函数吗?

当指向删除和指向不同的对象时,C++ 中的 Seg 错误指针

将指向单例的指针分配给对象字段

关于C++基类、派生类的引用和指针

空悬指针和野指针(Dangling pointer and wild pointer)

链表前哨节点,以避免将指针重新分配给第一个节点