如何初始化一个属于类成员的shared_ptr?

我不确定初始化是类的成员的shared_ptr的好方法。 你能告诉我,在C::foo()select的方式是好还是有更好的解决scheme?

 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()) { } 

哪一个更加正确和安全。

如果不pipe什么原因, new Anew B抛出,你就不会泄漏。

如果new A抛出,那么没有分配内存,exception中止你的构造函数。 没有任何build设。

如果new B抛出,exception仍然会中止你的构造函数: mA将被正确的破坏。

当然,由于B的实例需要一个指向A的实例的指针,所以成员的声明顺序很重要

在你的例子中,成员声明顺序是正确的,但是如果这个顺序是正确的,那么你的编译器可能会抱怨mBmA之前被初始化,并且mB的实例可能会失败(因为mA不会被构造,因此调用mA.get()调用未定义的行为)。


我也build议你使用shared_ptr<A>而不是A*作为你的B构造函数的参数( 如果它使感官和如果你能接受小的开销)。 这可能会更安全。

也许保证一个B的实例不能没有A的实例,然后我的build议不适用,但是我们在这里缺乏上下文来给出关于这个的确切的build议。