[英]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.