話不多說,直接上**:
#define _crt_secure_no_warnings
#include using namespace std;
class a
~a()
private:
char *p;
};class b:public a
~b()
private:
char *p;
};void play(a *base)
int main(void)
編譯執行結果如下:
分解結果發現,在delete base的時候,只是呼叫了a類的析構函式,而沒有呼叫b類的析構函式,這個時候就造成了記憶體洩露。這時虛析構函式就派生用場了。
虛析構函式的作用:通過父類指標把所有的子類物件的析構函式都執行一遍,這樣就能避免記憶體洩露問題。
修改**如下:
class a
virtual ~a()
private:
char *p;
};
只需要在基類的析構函式前加上virtual屬性。編譯執行結果如下:
這時發現a類和b類的析構函式都被執行了。
當然虛析構函式只是用在我們想通過父類指標去釋放所有資源的場景,如果我們直接使用子類指標去delete的話,它也會把所有的資源,包括父類、祖先類的析構函式全部都呼叫一次。
C 析構函式 虛析構函式
1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...