[英]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 A
或new 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.