首頁 > 後端開發 > C++ > 在沒有多型類別虛擬析構函數的情況下,shared_ptr 可以運作嗎?

在沒有多型類別虛擬析構函數的情況下,shared_ptr 可以運作嗎?

Mary-Kate Olsen
發布: 2024-12-16 11:45:11
原創
129 人瀏覽過

Can shared_ptr Work Without Polymorphic Class Virtual Destructors?

沒有多態類虛擬析構函數的Shared_Ptr 實作

Armen Tsirunyan 和Daniel Lidström 關於share_ptr 實現的虛擬析函數的必要構樣在性的爭論中,確實可以設計一個不需要這樣的shared_ptr

技術實作

這個實作的關鍵在於類型擦除。 Shared_ptr 不僅管理引用計數器,還管理儲存在相同記憶體區塊中的刪除器物件。此刪除器的類型與shared_ptr的類型不同,允許靈活地管理具有不同動態類型的物件。

引入了模板化建構子:

template<class T>
class shared_ptr
{
public:
   ...
   template<class Y>
   explicit shared_ptr(Y* p);
   ...
};
登入後複製

當使用a構造shared_ptr時派生類別的指標(例如,shared_ptr sp (new Derived)),Y=Derived 的模板化構造函數為呼叫。此建構函式使用衍生類別的特定知識建立刪除器物件。當參考計數達到零時,即使基底類別中沒有虛擬析構函數,此刪除器也用於安全地處置衍生實例。

C 11 標準要求

C 11 標準明確定義了此構造函數的要求:

  • 指針p 必須可轉換為T * 和Y 必須是完整型別。
  • 表達式「delete p」必須格式良好,具有明確定義的行為,並且不會引發異常。

對於析構函數:

  • 如果shared_ptr為空或共享所有權,則沒有邊
  • 如果shared_ptr擁有一個帶有刪除器d的對象,則呼叫d(p)。
  • 否則,如果shared_ptr擁有一個指標p,則呼叫「delete p」。

因此,shared_ptr 實作利用型別擦除並仔細管理刪除器以有效地處置具有不同動態類型的對象,即使不需要多型類中的虛擬析構函數。

以上是在沒有多型類別虛擬析構函數的情況下,shared_ptr 可以運作嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板