GNU GCC 中的多個析構函數(g )
問題:
在調查程式碼覆蓋率時在GNU GCC (g ) 中,在BaseClass 和DerivedClass 中都觀察到了多個析構函數。為什麼會產生這些多個析構函數,它們有何不同?
答案:
在Itanium C ABI 中,定義了三種類型的析構函數:
-
D2(基礎物件析構函數): 銷毀物件本身、非虛擬基底類別和資料成員。
-
D1(完整對象析構函數): 銷毀對象,包括虛擬基類。
-
D0(刪除物件析構函數): 銷毀對象,呼叫運算子 delete 來釋放記憶體。
給定程式碼中的多個析構函數:
給定程式碼產生多個析構函數,因為它包含虛擬基底類別。在本例中:
- DerivedClass::~DerivedClass() 是 D1 析構函數,它銷毀 DerivedClass 物件及其虛擬基底類別 (BaseClass)。
- DerivedClass::~DerivedClass () 是 D2 析構函數,僅銷毀 DerivedClass 對象,不包含虛擬基底類別。
- BaseClass::~BaseClass() 是 DerivedClass 內的 BaseClass 子物件的 D1 析構函數。
選擇性使用析構函數:
Itanium C ABI 指定要執行哪個析構函數:
- 刪除指向性指向基類別的指標(例如, delete b_ptr) 呼叫D0(預設)或D1(如果類別有虛擬析構函數)。
- 刪除指向完整物件指標的指標(例如 DerivedClass* dptr)會呼叫 D1。
覆蓋率影響:
要實現100% 的函數覆蓋率,了解這些析構函數並在單元測試中相應地調用它們非常重要。例如,b_ptr 應以 BaseClass* b_ptr 刪除以執行 D0 並覆寫兩個析構函數。
以上是GNU GCC (g ) 中的多個析構函數有何不同以及它們為何產生?的詳細內容。更多資訊請關注PHP中文網其他相關文章!