我正在用 C++ 编写一个相对较大的项目,并且在删除对象时遇到了问题。该项目,准确地说是一个roguelike游戏。
我有一个类Npc
是游戏中的每一个怪物。它们被创建并存储在一个单独的类中,该类Storage<Npc>
负责管理它们(加载、保存、创建、删除等)。每当怪物死亡时,相应的对象npc
必须被删除并完全销毁。删除对象本身不是问题,我只是从Storage<NPC>
. 问题是代码包含很多指向这个已经死亡的指针,这些指针npc
现在是无效的,尝试使用它们会导致很多问题。例如:
- 在他死之前,他可能打算执行一项行动。
- 他站立的瓷砖上记录着指向他的指针。
- 他可能参与了一些持续的活动,比如与某人搏斗。
代码中有很多这样的指针,因此几乎不可能简单地跟踪它们。我需要的是某种方法来确定 annpc
已经死了,并且该地址上没有存储任何实际对象,因此仍然具有该指针的代码部分可以对他的死做出充分的反应。
我自己提出了几个想法,但到目前为止,它们对我来说似乎都不是很好:
- 我可以问
Storage<NPC>
班级是否在这样的地址上有一个对象。潜在的问题是对象删除后,可能会在同一个地址上分配另一个对象,这将导致错误。 - 我可以通知所有可能使用无效指针的位置。这是一个坏主意,因为这样的位置的数量会随着时间的推移而增加,这样做很痛苦。
- 我可以实现一些版本的智能指针,但我不确定使用哪一个。
tl;博士版本:我需要一个解决方案,它会告诉我指针是否指向一个对象,或者它指向一个空闲的内存块,还是指向在原始对象删除后分配的某个其他对象。