在我們的辯論中,我們質疑要求多態性類別為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中文網其他相關文章!