在传递到超类的构造函数时临时提升::shared_ptr

Temporary boost::shared_ptr when passing to constructor of superclass

本文关键字:shared ptr 超类 构造函数      更新时间:2023-10-16

在一个库项目中,我有一个低级别的BaseClass类,它将某个对象的boost::shared_ptr作为构造函数中的参数,如下所示。

class SomeClass {
  public:
    SomeClass(int i);
};
class BaseClass {
  private:
    boost::shared_ptr<SomeClass> someObject;
  public:
    BaseClass(boost::shared_ptr<SomeClass> object) : someObject(object) {}
};

我现在想创建一个派生类,该派生类使用一个新对象初始化shared_ptr,该对象是根据传递给派生类构造函数的值创建的。

class DerivedClass : public BaseClass {
  public:
    DerivedClass(int i) 
      : BaseClass(boost::shared_ptr<SomeClass>(new SomeClass(i))) 
    {}
};

问题是这会创建一个临时shared_ptr对象。根据文档中的最佳实践,应尽可能避免这种情况,因为这可能会导致内存泄漏。http://www.boost.org/doc/libs/1_56_0/libs/smart_ptr/shared_ptr.htm#BestPractices

然而,我不知道如何在不修改构造函数的签名并因此更改库的API的情况下创建一个命名的shared_ptr对象。

有办法摆脱这种局面吗?

最佳实践页面建议了第二种方法,这就是您应该做的:使用make_shared