2012-01-07 122 views
7

我有兩個類,BASE_CLASS和derived_class和以下代碼:經由指針刪除派生對象到它的基類

base_class *ptr = new derived_class; 
delete ptr; 

將這個代碼產生內存泄漏?如果是這樣,我該如何處理?

+1

的代碼不能編譯。我建議首先通過編譯器傳遞它。更好的是:'base_class * ptr = new derived_class();' – 2012-01-07 10:41:48

+3

如果'base_class'沒有虛擬析構函數,這將觸發未定義的行爲(§5.3.5/ p3) – 2015-05-06 17:39:39

回答

21

它不會泄漏你正在刪除的對象,它的內存塊將被釋放。

如果您還沒有宣佈base_class析構函數是虛擬的,然後它會泄漏包含在derived_class依賴的derived_class析構函數中的任何動態分配的對象被稱爲釋放他們。這是因爲如果析構函數不是虛擬的,則在這種情況下不調用derived_class析構函數。這也意味着derived_class中的「嵌入對象」的析構函數不會自動被調用,這是一個單獨的但附加的問題,它可能導致進一步的泄漏和重要清理代碼的不執行。

簡而言之,聲明base_class中的析構函數是虛擬的,您可以安全地使用您提供的技巧。

對於編碼例如,參見:

In what kind of situation, c++ destructor will not be called?

+0

謝謝,這回答了我的顧慮 – 2012-01-07 11:36:30

相關問題