簡體   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