非多態共享指標:揭開秘密
Lidström 先生和Tsirunyan 先生之間的激烈爭論提出了一個基本問題:實現爭論shared_ptr而不需要多型虛擬析構函數是可行的上課嗎?
先生。 Lidström 的斷言 shared_ptr
但是,C 11 標準和 Boost 函式庫表明,這樣的實作確實是可能的。這項壯舉是透過「類型擦除」的概念來完成的:
template<class T> class shared_ptr { public: ... template<class Y> explicit shared_ptr(Y* p); ... };
在提供的範例中,shared_ptr 當參考計數降至零時,刪除器物件將了解呼叫派生類別的結構來處理分配的記憶體。 C 11 標準在以下要求中明確指定了此行為構造函數: 這可以確保正確調用刪除器並安全地釋放內存,即使指針從Derived 轉換為Base 。 同樣,標準概述了析構函數行為: 透過利用模板化建構函式和型別擦除,shared_ptr 可以避免對virtual 的需要多態性類別中的析構函數,為更廣泛的場景提供高效的記憶體管理。 Requires: ... The expression delete p shall be well formed, shall have well defined behaviour and shall not throw exceptions.
Effects: Constructs a shared_ptr object that owns the pointer p.
Effects: ... Otherwise, if *this owns a pointer p, and delete p is called.
以上是在多型類別中,「shared_ptr」可以在沒有虛擬析構函數的情況下運作嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!