shared_ptr作为类成员

时间:2010-05-10 05:31:38

标签: c++ boost shared-ptr

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

例如

class B;  // forward declaration   

class A {
   private:
      B* pB;
};

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

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

4 个答案:

答案 0 :(得分:5)

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

这是常规练习。如你所述,它避免了明确调用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而不是开销且可移动的。{/ p>

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

答案 1 :(得分:2)

如果此指针未从类实现中传出且执行速度至关重要,请使用scoped_ptr而不是shared_ptr。 shared_ptr有开销。

答案 2 :(得分:1)

使用shared_ptr将允许您将所有权传递给另一个对象,以便在外部对象被销毁时不会销毁它。你声明在这种特殊情况下这不会引起关注。

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

如果您不需要担心所有权问题,即使auto_ptr也足够好。

答案 3 :(得分:0)

对于作文,是的,如果你不想要身体依赖,那是个好主意。然后当A出现时,你的B将被自动销毁。

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

(如果身体依赖是一个问题,你也可以检查pimpl习语。)