应该从unique-owner-collection返回weak_ptr还是shared_ptr?

时间:2016-05-22 12:15:18

标签: c++ shared-ptr smart-pointers weak-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,则会使用EntityManager函数从getEntityByID收到。{/ p>

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

我的问题是,weak_ptr是否应该返回getEntityByIDweak_ptr

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

即使每个人都存储weak_ptr,只要他们使用,他们就会转换为shared_ptr,并且在使用它时,有人可能会尝试在中央管理器中将其删除。这将失败,因为一个临时的&#39; shared_ptr存在。

在一个中等复杂的情况下,这种情况会发生,简单的测试就不会暴露它,导致后来难以推断出错误。

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