智能指针概念的所有权和有效期

问题描述 投票:0回答:1

使用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个回答
0
投票

您可以返回const std::unique_ptr<Object>&,它使您具有与原始指针相同的语义,可以在不删除的情况下调用其上的方法。

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

总是存在犯错误的余地,因此答案实际上取决于特定情况,将使用此代码的地方,等等。

© www.soinside.com 2019 - 2024. All rights reserved.