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

C++ 智能指针和在整个程序中的依赖性,一旦使用,c++,smart-pointers,C++,Smart Pointers,怪物的储存: class MonstersStorage { public: std::weak_ptr<Monster> getMonster(int ID) const; private: std::vector<std::shared_ptr<Monster>> monsters; } 它必须是: getDamageDealedBy(const std::weak_ptr<Monster>&); getDa

怪物的储存:

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

getDamageDealedBy(const std::weak_ptr<Monster>&);
getDamageDealedBy(const std::weak_ptr&);
它根据怪物的存储实现获取所有代码

我的问题是,对于这样的函数,我是否应该只使用简单的引用,由*.get()从智能指针接收, 或者在
Monster
类的情况下,应该在整个程序中使用弱ptr


编辑:每次使用this.lock()函数,在访问monster时,都会反复将其转换为shared_ptr,只有一个人知道这个问题的答案。这个人确切地知道智能指针拥有的每个对象的范围和生存期。那就是你

当引用特定对象的最后一个
std::shared_ptr
超出范围时,该对象将被销毁。如果根据应用程序使用这些对象的方式,当应用程序的其他部分使用常规“非智能”指针引用此对象时,这种情况永远不会发生,那么,当然,只使用常规指针是可以的

例如,这里有一种情况,您知道使用普通指针是安全的

void somefunction(const std::shared_ptr<Monster> &monster_ptr)
{
    Monster *p=monster_ptr.get();

    // ... Use p inside this function
}
void somefunction(const std::shared_ptr和monster_ptr)
{
怪物*p=Monster_ptr.get();
//…在此函数中使用p
}
由于
std::shared_ptr
作为参数传递给
somefunction()
,并且
monster_ptr
的作用域存在于整个
somefunction()
中,因此使用
get()
并在该函数中使用返回的指针是安全的

您知道,
monster_ptr
将在该功能期间存在。因此,
monster_ptr
将保留对底层对象的
std::shared_ptr
引用,因此在该函数期间(以及从该函数调用的任何其他函数期间),始终至少有一个对底层对象的智能引用<只有在
somefunction()
返回后,code>monster_ptr才会超出范围,在此之前,我们保证您将对底层对象进行智能引用,并且使用直接本机指针是安全的

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

void somefunction(const std::shared_ptr<Monster> &monster_ptr)
{
    Monster *p=monster_ptr.get();

    // ... Use p inside this function
}