我在C++中编写了一个相对较大的项目,并且存在对象删除问题。该项目,准确地说是一个roguelike游戏。C++安全对象删除
我有一个类Npc
这是游戏中的每个怪物。它们被创建并存储在一个单独的类Storage<Npc>
中,负责其管理(加载,保存,创建,删除等)。每当怪物死亡时,相应的对象npc
必须完全删除并销毁。删除对象本身并不是一个问题,我只需要调用Storage<NPC>
中的一个方法。问题是代码中包含了很多指向这个已经死亡的npc
的指针,现在这些指针是无效的,并且试图使用它们会导致很多问题。例如:
- 在他去世前可能会有一个他打算执行的操作。
- 他在其上放置唱片的瓷砖上有一个指向他的指针。
- 他可能参与过一些连续的活动,比如擒拿某人。
代码中有很多这样的指针,所以几乎不可能简单地跟踪它们。我需要的是确定一个npc
已经死亡的方法,并且该地址上没有存储实际的对象,所以仍然有这个指针的代码部分可以充分地对他的死亡作出反应。
我自己也想出了一些想法,但至今没有人似乎真的对我好:
- 我可以问
Storage<NPC>
类,如果有这种地址的对象。潜在的问题是,删除对象后,可能会在同一地址分配另一个对象,这会导致错误。 - 我可以通知所有可能使用无效指针的位置。这是一个坏主意,因为这些地点的数量会随着时间的推移而增加,这样做是一种痛苦。
- 我可以实现一些版本的智能指针,但我不确定要使用哪一个。
TL;博士版本:我需要一个解决方案,如果一个指针指向会告诉我一个对象,或者它指向的内存空闲块,或者一些其他的对象,原来的对象删除后分配。
每当内存被释放/变得无效时,如何将它设置为'nullptr'? :P – SingerOfTheFall
您已经用答案标记了您的问题:使用智能指针。我建议使用std :: shared_ptr – stefan
@SingerOfTheFall,我猜你想说的是,每当我做'删除pnpc;'我应该'pnpc = 0;'。但是,如果有另一个指针等于'pnpc'被存储在程序中的其他地方,它不会被设置为0,所以我猜这是行不通的。 – Saage