shared_ptr作为类成员

dim*_*mba 8 c++ boost shared-ptr

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

例如

class B;  // forward declaration   

class A {
   private:
      B* pB;
};
Run Code Online (Sandbox Code Playgroud)

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

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

ere*_*eOn 5

是的你可以(应该?).

这是一种常见的做法.如你所述,它避免了明确调用delete()的需要.

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

class RSAKey
{
  public:

    RSAKey();

  private:

    shared_ptr<RSA> d_rsa; // A pointer to a RSA structure from OpenSSL
}
Run Code Online (Sandbox Code Playgroud)

其中我初始化如下:

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.
}
Run Code Online (Sandbox Code Playgroud)

当不再使用d_rsa时,RSA_free()将发生自动呼叫.这不是很酷吗?


更新

如果C++11是一个选项,你应该更好地使用,std::unique_ptr而不是开销和可移动.

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


Nik*_*kko 0

就合成而言,是的,如果您不想身体依赖,那么这是一个好主意。那么当A存在的时候你的B就会自动被销毁。

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

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