繁体   English   中英

如何初始化作为类成员的shared_ptr?

[英]How to initialize a shared_ptr that is a member of a class?

我不确定初始化作为类成员的shared_ptr的好方法。 您能告诉我,我在C::foo()选择的方式是否正确,还是有更好的解决方案?

class A
{
  public:
    A();
};

class B
{
  public:
    B(A* pa);
};

class C
{
    boost::shared_ptr<A> mA;
    boost::shared_ptr<B> mB;
    void foo();
};

void C::foo() 
{
    A* pa = new A;
    mA = boost::shared_ptr<A>(pa);
    B* pB = new B(pa);
    mB = boost::shared_ptr<B>(pb);
}

您的代码是完全正确的(可以工作),但是您可以使用初始化列表,如下所示:

C::C() :
  mA(new A),
  mB(new B(mA.get())
{
}

哪个更正确,更安全。

如果无论出于何种原因, new Anew B抛出,您都不会泄漏。

如果抛出new A ,则不会分配任何内存,并且异常也会中止构造函数。 什么也没建。

如果new B抛出,并且异常仍将中止您的构造函数: mA将被正确地破坏。

当然,由于B的实例需要指向A的实例的指针,因此成员的声明顺序很重要

成员声明顺序是你的榜样是正确的,但如果它发生了逆转,则你的编译器可能会抱怨mB前beeing初始化mA和实例化mB可能会失败(因为mA不会被尚未构建,从而调用mA.get()调用未定义的行为)。


我还建议您使用shared_ptr<A>代替A*作为B构造函数的参数( 如果有道理并且可以接受少量开销)。 可能会更安全。

也许可以保证B的实例不能没有A的实例就无法生存,那么我的建议就不适用了,但是我们在这里缺乏上下文来给出明确的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM