繁体   English   中英

一旦使用,智能指针及其在整个程序中的依赖关系

[英]Smart pointers and dependency on it in the whole program, once used

存放怪物:

class MonstersStorage
{
  public:
    std::weak_ptr<Monster> getMonster(int ID) const;
  private:
    std::vector<std::shared_ptr<Monster>> monsters;
}

游戏中只有一只怪物。 有很多使用Monster对象的代码。

我将怪物的存储区存储为仅出于一个原因-有时需要在其他地方临时存储对Monster引用,并且怪物可以死(被删除并从存储区中删除)-因此引用必须安全地到期。 否则,我只会使用普通的指针。

问题是,在整个游戏中,在每个使用Monster地方,它都必须是弱指针,而不是简单的引用或指针-因为所有Monster对象都来自一个来源-Monsters Storage。

即使在仅需要将Monster传递给它们并对其进行一些操作但不保存对其引用的函数的情况下。 例如:

getDamageDealedBy(const Monster&);

它必须是:

getDamageDealedBy(const std::weak_ptr<Monster>&);

它获取所有代码取决于怪物的存储实现。

我的问题是,在使用此类函数的情况下,我应该只使用简单的引用(由* .get()从智能指针接收),还是在Monster类的情况下在整个程序中使用weak_ptr?

编辑:并且每次访问怪物时都反复使用此.lock()函数将其转换为shared_ptr

只有一个人可以回答这个问题。 这是确切知道智能指针拥有的每个对象的范围和生存期的人。 那就是你。

当引用特定对象的最后一个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() monster_ptr存在,所以可以安全地使用get()并在此函数内使用返回的指针。

您知道在此功能期间, monster_ptr将存在。 因此, monster_ptr将保留对基础对象的std::shared_ptr引用,因此,在此函数的运行期间(以及其他任何从此函数调用)。 monster_ptr仅在somefunction()返回之后somefunction()超出范围,并且在此之前,可以确保您对基础对象具有智能引用,并且使用直接本机指针是安全的。

总结:如果可以证明在应用程序的特定点上,可以确保至少有一个std::shared_ptr引用给定对象,那么使用普通指针访问该对象是安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM