【问题标题】:Smart pointer concepts ownership and lifetime智能指针概念所有权和生命周期
【发布时间】:2020-06-03 01:46:59
【问题描述】:

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

【问题讨论】:

    标签: c++ pointers smart-pointers object-lifetime ownership-semantics


    【解决方案1】:

    您可以返回一个const std::unique_ptr&lt;Object&gt;&amp;,这将允许您使用与原始指针相同的语义来调用其上的方法,同时防止删除。

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

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

    【讨论】:

    • 对于非常通用的组件,我不知道它们将如何使用。对于这样的可重用组件,我不想过多地限制用例,但我仍然希望比原始指针提供更多的安全性。我如何知道调用者是否使用 child() 进行快速计算(之后立即丢弃指针)或者调用者是否存储指针以进行更长时间的访问者递归?假设速度不是问题,那么基于智能指针的模式是什么?
    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 2017-04-29
    • 1970-01-01
    • 2010-12-02
    • 2014-07-25
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多