【问题标题】:shared_ptr as class membershared_ptr 作为类成员
【发布时间】:2010-05-10 05:31:38
【问题描述】:

通常将包含的对象声明为指向该类的指针,同时在头文件中“前向声明”它们。这是为了减少代码中的物理依赖。

例如

class B;  // forward declaration   

class A {
   private:
      B* pB;
};

将这样的成员声明为shared_ptr而不是裸指针是个好主意吗?

我更喜欢 scoped_ptr,但 AFAIK 它不是标准的。

【问题讨论】:

  • 如果您需要共享指针语义 - 为什么不呢?我不清楚你在这里实际问的是什么。
  • 我不需要共享指针语义。由于我将 B 声明为指向 B 的指针(以减少类 A 的物理依赖性),因此我需要通过调用 new 创建 B。因此我需要在 A 的 d-tor 中删除它。工作量不大,但问题是是否在这里使用 shared_ptr 来处理 B 释放问题,是否是一个好方法。
  • @idimba:如果您不需要共享指针所提供的功能,为什么要使用共享指针?如果您不需要指针所提供的功能,也不要使用其中之一。一个很好的经验法则是不要使用与您想要做的事情不匹配的语言功能。
  • shared_ptr / unique_ptr FTW ! !
  • 为什么它可以减少代码中的物理依赖。

标签: c++ boost shared-ptr


【解决方案1】:

是的,你可以(应该?)。

这是一种常见的做法。正如你所说,它避免了显式调用 delete() 的需要。

你可以走得更远。这是一个例子:

class RSAKey
{
  public:

    RSAKey();

  private:

    shared_ptr<RSA> d_rsa; // A pointer to a RSA structure from OpenSSL
}

我是这样初始化的:

RSAKey::RSAKey()
{
  RSA* rsa = RSA_generate_key(1024, 1, NULL, NULL);

  if (NULL == rsa) throw DummyException();

  d_rsa.reset(rsa, RSA_free); // Note the specific release method.
}

当不再使用 d_rsa 时,将自动调用 RSA_free()。是不是很酷?!


更新

如果C++11 是一个选项,您可能最好使用std::unique_ptr,因为它的开销较小且可移动。

这取决于您希望封闭类在复制方面的行为方式。

【讨论】:

  • 自动会员解除分配正是我的问题:)
【解决方案2】:

如果这个指针没有从你的类实现中传递出去并且执行速度很重要,使用 scoped_ptr 而不是 shared_ptr。 shared_ptr 有开销。

【讨论】:

  • 我相信 scoped_ptr 不在传入的 C++0X 标准中。
  • @idimba,unique_ptr是它的C++版本,也是可移动的。
【解决方案3】:

使用shared_ptr 将允许您将所有权传递给另一个对象,这样当您的外部对象被销毁时它就不会被销毁。您声明在这种特殊情况下这不会成为问题。

智能指针的唯一优势是您无需记住在析构函数中放入delete pB。对于大多数人来说,这可能就足够了。

当您不需要担心所有权问题时,即使是 auto_ptr 也足够了。

【讨论】:

    【解决方案4】:

    如果是组合,是的,如果您不想要物理依赖,这是一个好主意。那么当 A 存在时,你的 B 会自动销毁。

    如果你不介意物理依赖,你可以按值保存数据成员。

    (如果物理依赖存在问题,您还可以检查 pimpl 习惯用法。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多