首頁  >  文章  >  後端開發  >  為什麼不能在建構函式中使用“shared_from_this()”?

為什麼不能在建構函式中使用“shared_from_this()”?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-06 15:35:02458瀏覽

Why Can't You Use `shared_from_this()` in Constructors?

理解建構函式中shared_from_this的限制

如《C標準函式庫》摘錄中所述,shared_from_this()面臨著一個技術問題構造函數內的限制。要理解這個概念,有必要深入研究shared_from_this()的內部運作原理。

弱指標在shared_from_this中的作用

shared_from_this()依賴於一個內部的weak_ptr 維護對創建的物件的弱引用。這個弱指標保持未初始化狀態,直到為該物件建立強shared_ptr(擁有該物件的shared_ptr)。只有在實例化第一個shared_ptr後,物件的基底類別enable_shared_from_this才能存取這個shared_ptr並初始化weak_ptr。

構造時序問題

這個依賴現有的shared_ptr給構造函數帶來了問題。當呼叫建構函式時,尚不存在指向正在建構的物件的shared_ptr。因此,在建構過程中,enable_shared_from_this無法初始化其weak_ptr,進而導致shared_from_this()在建構子中無法使用。

澄清範例

請考慮以下程式碼片段:

class Person : public std::enable_shared_from_this<Person> {
   ...
};

std::shared_ptr<Person> p(new Person());

在此範例中,Person() 的建構子在shared_ptr p 的構造函數之前運行。這表示在Person()建構函式期間,不存在指向Person物件的shared_ptr,從而禁止enable_shared_from_this初始化其weak_ptr並導致建構函式內無法存取shared_from_this()。

以上是為什麼不能在建構函式中使用“shared_from_this()”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn