使用C ++智能指针(唯一,共享,弱)时,有两个重要的概念(所有权,生存期)。我试图了解这些概念以及它们如何影响智能指针(或原始指针)的使用。
我阅读了两个规则:
示例:
class Object
{
public:
Object* child(int i) { return mChildren[i]; }
// More search and access functions returning pointers here
private:
vector<Object*> mChildren;
};
我想使用智能指针重写它。让我们先忽略child()。简单的游戏。父母拥有自己的孩子。因此,使mChildren为unique_ptr的向量。
根据上述规则,有些人认为child(i)应该继续返回原始指针。
但是这不冒险吗?有人可能会做一些愚蠢的事情,例如删除返回的对象,从而导致调试失败的困难......可以使用weak_ptr或shared_ptr作为返回值来避免这种情况。
不能说复制指针总是意味着暂时共享所有权和/或断言对象的生存期吗?
仅当我也没有获得更安全的API时才值得为孩子使用智能指针吗?
您可以返回const std::unique_ptr<Object>&
,它使您具有与原始指针相同的语义,可以在不删除的情况下调用其上的方法。
将std::unique_ptr
与原始指针一起使用是有意义的,因为您知道所有权将在任何原始指针中保留下来,并且您可以确定人们不会尝试直接delete
指针。因此,与使用std::weak_ptr
和std::shared_ptr
不同,因为它们根本不允许您使用悬空指针。
总是存在犯错误的余地,因此答案实际上取决于特定情况,将使用此代码的地方,等等。