weak_ptr还是shared_ptr应该从唯一所有者集合返回



Entity对象的唯一所有者是EntityManager

class EntityManager
{
public:
std::weak_ptr<Entity> vs std::shared_ptr<Entity> getEntityByID(int ID) const;
private:
std::vector<std::shared_ptr<Entity>> entities;
};

当程序中需要使用Entity时,使用getEntityByID函数从EntityManager接收。

Entity不应该作为shared_ptr存储在程序中的其他位置,因为EntityManager是唯一的所有者,但它可以作为weak_ptr存储在许多位置。

我的问题是,getEntityByID是否应该返回weak_ptrshared_ptr

我使用weak_ptr作为返回值的论点:

  • 在getEntityByID函数签名中很清楚,weak_ptr应该在获取Entity之后使用

使用shared_ptr作为返回值的参数:

  • weak_ptr无论如何都可以转换为shared_ptr,然后可以存储为CCD_ 17在其他地方。另外,每次使用时,都会使用lock函数将其转换为shared_ptr
  • 当使用shared_ptr时,在每个函数中它都可以通过CCD_ 20。不再需要每次使用ptr都使用lock函数。如果它能决定要存储指针,只需将其作为数据成员复制到weakptr

如果像您所说的EntityManager是实体的唯一所有者,则应将实体存储为unique_ptr,而不是shared_ptr。在更改为unique_ptr的矢量后,应该从.get()方法返回原始指针。理想情况下,EntityManager可以将Entites存储为对象而不是指针,并返回对存储对象的引用或常量引用。

shared_ptr用于共享所有权。存储在shared_ptr中的任何对象都不认为它具有确定对象生存期的唯一权限。

即使每个人都存储weak_ptr,每当他们使用时,他们都会将其转换为shared_ptr,在使用时,有人可能会试图在中央管理器中删除它。这将失败,因为存在"临时"shared_ptr

在中等复杂的情况下,这种情况会发生,而简单的测试不会暴露它,导致以后很难对错误进行推理。

您可以使用弱/共享来解决这个问题,但只能作为实现细节:语义必须在智能指针之上强制执行。这些语义将决定所使用的智能指针。

相关内容

  • 没有找到相关文章

最新更新