0

在使用 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 时才值得为儿童使用智能指针吗?

4

1 回答 1

0

您可以返回 a const std::unique_ptr<Object>&,这将允许您具有与原始指针相同的语义来调用其上的方法,同时防止删除。

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

总是有出错的余地,所以答案真的取决于具体情况,这段代码将在哪里使用等等。

于 2020-02-18T23:56:15.677 回答