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
是否应该返回getEntityByID
或weak_ptr
我使用shared_ptr
作为返回值的论点:
我使用weak_ptr
作为返回值的论点:
shared_ptr
可以转换为weak_ptr
,然后可以存储为
shared_ptr
在其他地方。另外,每次使用它都会使用shared_ptr
函数转换为shared_ptr。lock
时,那么在每个函数中它都可以通过
shared_ptr
。每次使用ptr都不再需要使用shared_ptr
函数。如果它会决定
存储指针,然后它将它作为数据成员复制到weak_ptr。答案 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来解决此问题,但仅作为实现细节:必须在智能指针之上强制执行语义。这些语义将决定使用的智能指针。