簡體   English   中英

Boost :: shared_ptr使用它實例化

[英]Boost::shared_ptr instantiated using this

考慮以下情況:

typedef boost::shared_ptr<B> BPtr;

class A
{
public:
    A() { b_ptr = BPtr(new B); }
    void a_func() { C::c_func(b_ptr); }
private:
    BPtr b_ptr;
}

class B
{
public:
    B() { b_ptr = BPtr(this); }
    void b_func() { C::c_func(b_ptr); }
private:
    BPtr b_ptr;
}

class C
{
public:
    static void c_func(BPtr b_ptr) { /*...*/ }
}

可以用this實例化shared_ptr嗎?
是否可以讓兩個shared_ptr對象指向同一個對象? (例如A :: b_ptr和B :: b_ptr)
如果這兩個中的一個超出范圍 - B的實例是否會被刪除?

我猜我在做一些根本錯誤的事情。
我還考慮過將b_ptr的依賴注入用於B的構造函數,但這似乎也是非常錯誤的。

更新:
澄清 - A和B都需要使用C :: c_func。 反過來,經過一些處理后,C需要在B中調用一個我沒有在上面指定的回調函數。 實際上有兩個案例很有意思:

  1. 如果要求C不是有狀態的 - 那么它需要從A和B中接收BPtr,如上面的代碼所示。
  2. 如果C是有狀態的,並且A和B都實例化單獨的C實例,則在C的ctor中給出BPtr。

可以用這個實例化shared_ptr嗎?

不,至少有幾個原因:

  1. 如果在堆棧上或靜態地創建AB對象,最終會得到一個shared_ptr “擁有”堆棧上創建的對象; 當對象被銷毀時,將調用shared_ptr析構函數,在對象上調用delete ,並且只有Bad Things會發生。 此外,即使對象是動態創建的,您也不確定類的所有者可以使用它做什么:他可以將它分配給某些其他類型的智能指針,如auto_ptr ,它具有完全不同的語義。

  2. 你最終得到一個循環引用。 例如, b_ptr擁有它b_ptrB對象。 你必須手動.reset()它才能銷毀B對象。

你可以得到一個shared_ptr ,從this使用enable_shared_from_this ,但也有很多需要注意的地方:即,你不能叫enable_shared_from_this在構造函數中。 即便如此,您也不希望將shared_ptr存儲到對象本身內的對象中; 它沒有任何意義。

我猜我在做一些根本錯誤的事情。

是的,但既然你沒有說出你正在嘗試做什么,那么很難說你應該做什么。 您只告訴我們您是如何嘗試這樣做的,而不是您首先嘗試做的事情。

我建議你重新設計使用std :: enable_shared_from_this,例如

class B
{
   B();
public:
   std::shared_ptr<B> create() { return std::make_shared<B>(); } // Make sure B is allocated as shared_ptr inorder to ensure that shared_from_this() works.
};

但是,如果這是一個API問題,那么您可以執行以下操作(盡管我不建議這樣做)。

void b_func() { C::c_func(BPtr(this, [](B*){})); } // Empty deleter. Nothing happens when shared_ptr goes out of scope. Note that c_func cannot take ownership of the pointer.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM