如何初始化一个属于类成员的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 A
或new B
抛出,你就不会泄漏。
如果new A
抛出,那么没有分配内存,exception中止你的构造函数。 没有任何build设。
如果new B
抛出,exception仍然会中止你的构造函数: mA
将被正确的破坏。
当然,由于B
的实例需要一个指向A
的实例的指针,所以成员的声明顺序很重要 。
在你的例子中,成员声明顺序是正确的,但是如果这个顺序是正确的,那么你的编译器可能会抱怨mB
在mA
之前被初始化,并且mB
的实例可能会失败(因为mA
不会被构造,因此调用mA.get()
调用未定义的行为)。
我也build议你使用shared_ptr<A>
而不是A*
作为你的B
构造函数的参数( 如果它使感官和如果你能接受小的开销)。 这可能会更安全。
也许保证一个B
的实例不能没有A
的实例,然后我的build议不适用,但是我们在这里缺乏上下文来给出关于这个的确切的build议。