存放怪物:
class MonstersStorage
{
public:
std::weak_ptr<Monster> getMonster(int ID) const;
private:
std::vector<std::shared_ptr<Monster>> monsters;
}
游戏中只有一个怪物存储空间。有很多代码使用Monster
个对象。
我制作了怪物&#39;存储智能指针的存储只有一个原因 - 有时需要在其他地方临时存储对Monster
的引用,并且怪物可能会死亡(被删除并从存储中移除) - 因此重新安装必须安全到期。否则我只会使用普通指针。
问题是,在整个游戏中,在使用Monster
的每个地方,它必须是弱指针而不是简单的引用或指针 - 因为所有Monster
个对象来自一个源 - 怪物存储。
即使是只需要将Monster
传递给它们并对其进行一些操作但不保存对它的引用的函数。例如:
getDamageDealedBy(const Monster&);
必须是:
getDamageDealedBy(const std::weak_ptr<Monster>&);
它取决于怪物的所有代码&#39;存储实施。
我的问题是,在这种函数的情况下,我应该只使用简单的引用,由智能指针的* .get()接收,
或者,如果Monster
类,则应在整个程序中使用weak_ptr。
编辑:并且每次使用此.lock()函数时,将其转换为shared_ptr,同时访问怪物
答案 0 :(得分:2)
只有这个问题有答案的人。这个人确切地知道智能指针所拥有的每个对象的范围和生命周期。那就是你。
当引用特定对象的最后一个std::shared_ptr
超出范围时,该对象将被销毁。如果,基于应用程序使用这些对象的方式,当应用程序的某些其他部分使用常规的“非智能”指针来引用此对象时,这种情况永远不会发生,那么,当然,只使用常规指针。
例如,在这种情况下,您知道使用普通指针是安全的。
void somefunction(const std::shared_ptr<Monster> &monster_ptr)
{
Monster *p=monster_ptr.get();
// ... Use p inside this function
}
由于std::shared_ptr
作为参数传递给somefunction()
,并且整个monster_ptr
存在somefunction()
的范围,因此只使用get()
是安全的并使用此函数中返回的指针。
您知道monster_ptr
将在此功能期间存在。因此,monster_ptr
将保留对基础对象的std::shared_ptr
引用,因此在此函数期间将始终至少有一个对基础对象的智能引用(并且持续时间)从该函数调用的任何其他函数)。 monster_ptr
仅在somefunction()
返回后才会超出范围,直到发生这种情况,才能确保您对底层对象有一个智能引用,并且使用直接本机指针是安全的。
总之:如果您可以证明在应用程序的某个特定位置保证至少有一个std::shared_ptr
引用给定对象,那么使用普通指针访问该对象是安全的。 / p>