首頁 >後端開發 >C++ >多型類別中沒有虛擬析構函數時,「shared_ptr」能否正常運作?

多型類別中沒有虛擬析構函數時,「shared_ptr」能否正常運作?

Susan Sarandon
Susan Sarandon原創
2024-12-08 13:50:10716瀏覽

Can `shared_ptr` Function Correctly Without Virtual Destructors in Polymorphic Classes?

在沒有虛擬析構函數的情況下實現shared_ptr

在我們的辯論中,我們質疑要求多態性類別為shared_ptr 實作提供虛擬析構函數的必要性。提出的論點聲稱,shared_ptr 在沒有此要求的情況下也可以正常運作。

讓我們更深入地研究 shared_ptr 的實現,以確定此聲明的有效性。

類型擦除和模板化建構函數

shared_ptr 利用類型擦除在同一記憶體區塊中儲存刪除器作為其參考計數器。該刪除器的類型不是shared_ptr類型的一部分。透過使用模板化建構函數,shared_ptr 可以根據所管理的特定類別來容納各種刪除器類型。

可以定義以下構造函數來處理此問題:

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

使用此構造函數時對於 Base 類和 Derived 類,可以建立並儲存適當的刪除器。當引用計數器降至零時,將呼叫此刪除器,以確保正確的物件處置。

C 11 標準要求

C 11 標準明確要求此行為模板化建構子:

》作用:建構一個擁有該指標的shared_ptr物件p."

這確認了shared_ptr承擔了傳遞的指標的所有權並負責其銷毀。 :如果

this擁有一個物件p 和刪除器d,則呼叫d(p)。否則,如果

this 擁有指標 p,則呼叫刪除 p。 」這表示如果shared_ptr 直接管理指標(即,沒有明確刪除器),預設析構函數刪除用於處理

結論

根據這些準則,很明顯,shared_ptr可以在不需要多型類別具有虛擬析構函數的情況下實現。

以上是多型類別中沒有虛擬析構函數時,「shared_ptr」能否正常運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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