2010-09-02 71 views
13

有人能夠用幾個簡潔的詞彙總結應該如何使用智能指針,特別是從使用綁定函數在io_service中註冊處理程序的角度來看。boost shared_from_this <>()

編輯:一些響應要求更多的上下文。基本上,我正在尋找「陷阱」,人們用這種機制觀察到的反直覺行爲。

+1

你到底明白了什麼?很難回答一個無法解釋的問題。 – GManNickG 2010-09-02 17:34:57

+0

我可以嘗試說明一個例子的唯一方法就是粘貼大量代碼,這些代碼作爲boost代碼足夠密集。 – 2010-09-02 20:40:13

回答

30

我遇到的最大「陷阱」是從構造函數中調用shared_from_this是非法的。這直接遵循的規則是,在調用shared_from_this之前,必須先存在shared_ptr對象。

+4

+1好建議,通常我會讓我的構造函數提供並提供一個靜態'shared_ptr create'方法。 – 2010-09-02 21:40:30

+2

我想你的意思是你讓你的構造函數是私人的。 – 2012-02-11 01:53:28

14

根據我的理解,有時在您的代碼中,您希望某個類爲自己提供shared_ptr的其他部分,以便代碼的其他部分可以在您的類的對象已構建後獲得shared_ptr。

問題是,如果你的類只有一個shared_ptr<>自己作爲成員變量,它永遠不會被自動破壞,因爲總是有「最後一個引用」掛在自己身上。從enable_shared_from_this繼承給你的類一個自動方法,它不僅返回一個shared_ptr,但只保留一個弱共享指針作爲成員變量,以免影響引用計數。這樣,當最後一次引用完成後,你的課程將像往常一樣被釋放。

我從來沒有用過它,但這是我對它是如何工作的理解。

8

shared_from_this<>用於對象想要訪問指向自身的shared_ptr<>的情況。

通常,一個對象只知道隱式指針this,但不知道管理它的任何shared_ptr<>。另外,this不能輕易轉換爲與其他現有的shared_ptr<>實例共享所有權的shared_ptr<>,因此對於自己獲得有效shared_ptr<>的對象沒有簡單的方法。

shared_from_this<>可以用來解決這個問題。例如:

struct A : boost::enable_shared_from_this<A> { 
    server *io; 
    // ... 

    void register_self() { 
     io->add_client(shared_from_this()); 
    } 
}; 
5

boost::asio::io_servicedestructor文檔解釋它相當好

破壞序列如上所述 允許程序通過使用 shared_ptr的<>簡化 其資源管理。其中一個對象的 壽命被聯繫在一個 連接(或 異步操作的一些其他序列),一個shared_ptr 到對象的生命週期將被綁定到 處理程序與它相關聯的所有異步 操作。這 工作如下:

  • 當一個連接結束後,所有相關的異步操作 完成。相應的處理程序對象被銷燬,並且所有 shared_ptr對對象 的引用都被銷燬。
  • 要關閉整個程序,io_service函數stop()被稱爲 以儘可能快地終止任何run()調用 。上面定義的io_service析構函數 銷燬所有處理程序, 導致所有的shared_ptr引用爲 所有連接對象爲 被銷燬。

通常你的目的將鏈異步操作,其中處理程序綁定到使用boost::bindboost::shared_from_this()成員函數。有一些examples使用這個概念。

+0

你的回答終於向我解釋了asio的例子......特別是如果連接和asio的http服務器示例有錯誤,會發生什麼情況。 – Coyote21 2012-05-07 15:58:29

相關問題