智能指针概念所有权和寿命

Smart pointer concepts ownership and lifetime

本文关键字:所有权 指针 智能      更新时间:2023-10-16

在使用C++智能指针时,有两个概念(所有权、生存期(很重要(唯一、共享、弱(。我试图理解这些概念,以及它们如何影响智能指针(或原始指针(的使用。

我读了两条规则:

  1. 始终使用智能指针来管理动态的所有权/生存期对象
  2. 在不管理所有权/寿命时不要使用智能指针

一个例子:

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>&,这将允许您具有与原始指针相同的语义来调用它上的方法,同时防止删除。

当您知道所有权将保留在任何原始指针上,并且您确信人们不会直接尝试delete指针时,将std::unique_ptr与原始指针一起使用是有意义的。这与使用std::weak_ptrstd::shared_ptr不同,因为它们根本不允许您使用悬挂指针。

总有犯错的空间,所以答案真的取决于具体情况,这个代码将在哪里使用等等。