一旦使用,智能指针和整个程序中的依赖

时间:2016-05-21 13:32:23

标签: c++ smart-pointers

存放怪物:

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,同时访问怪物

1 个答案:

答案 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>