首頁 >後端開發 >C++ >「shared_ptr」可以在「Base」中沒有虛擬析構函數的情況下管理「衍生」物件嗎?

「shared_ptr」可以在「Base」中沒有虛擬析構函數的情況下管理「衍生」物件嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-09 20:53:10458瀏覽

Can `shared_ptr` Manage `Derived` Objects Without a Virtual Destructor in `Base`?

Shared_Ptr 和沒有虛擬析構函數的多態性

在最近的一場辯論中,Daniel Lidström 斷言,shared_ptr用new Derived 構造的並不要求Base 中有一個虛擬析構函數。本文研究了這種實現的可行性。

在沒有虛擬析構函數的情況下實作 Shared_Ptr

這個實作的關鍵在於型別擦除。 Shared_ptr 不僅僅儲存引用計數器;它包括一個處理物件銷毀的刪除器(作為資料結構的一部分儲存)。這個刪除器可以是任何類型,允許超出T(shared_ptr的模板類型)範圍的自訂。

衍生類別的客製化

建立shared_ptr時< ;基地>從 Derived 物件中,呼叫模板化建構函數,從而允許指定具體類型 Derived。建構函數會根據動態型別建立必要的刪除器,即使 Base 中沒有虛擬析構函數,也能確保正確的物件銷毀。

範例實作

template<class T>
class shared_ptr
{
public:
   ...
   template<class Y>
   explicit shared_ptr(Y* p);
   ...
};

上述建構子允許建立一個shared_ptr。來自派生物件。

C 11 標準要求

C 11 標準明確要求此行為:

  • 模板化建構函數必須確保即使沒有虛擬析構函數,表達式delete p也具有明確定義的行為T.
  • 如果shared_ptr擁有一個沒有刪除器的對象,它應該呼叫delete p。

以上是「shared_ptr」可以在「Base」中沒有虛擬析構函數的情況下管理「衍生」物件嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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