C 中析構函式定義成虛函式的原因

2021-09-30 10:18:22 字數 1090 閱讀 6042

為什麼標準c++建議將虛構函式定義成虛函式,下面就來**這個問題。

#include

class base

~base()

private:

char *data;

};class baseex: public base

~baseex()

private:

char *m_data;

};void main()

很顯然,上述的程式有記憶體洩漏。這是因為當刪除pcbase時,它只呼叫了base的析構函式而沒呼叫baseex的析構函式,所以導致記憶體洩漏。再看下例:

#include

class cbase

~cbase()

private:

char *data;

};class cfunction

;~cfunction(){};

};class cfunctionex : public cfunction

;~cfunctionex(){};

private:

cbase m_cbase;

};void main()

這裡cfunctionex和cfunction中本身並沒有分配記憶體,應該不會有記憶體洩漏。和上例一樣當刪除pcfun時,它只呼叫了cfunction的析構函式而沒呼叫cfunctionex的析構函式,但cfunctionex本身並沒分配記憶體。所以發生記憶體洩露的地方是m_cbase,因為它是cbase的例項且是cfunctionex成員變數,當cfunctionex的析構函式沒有被呼叫時,當然m_cbase的析構函式也沒有被呼叫,所以cbase中分配的記憶體被洩漏。

解決以上問題的方法很簡單,就是使基類cfunction的析構函式為虛函式就可以了。

這樣就得出乙個結論,當你的基類的析構函式不為虛的話,其子類中所有的成員變數的類中分配的記憶體也將可能洩漏。

這裡說的可能是因為,如果程式中沒有以上示例類似寫法(指用基類指標指向子類例項,虛函式是c++的精華,很少有人不用的,由其是在大中型軟體專案中),就不會出現本文所說的記憶體洩漏。看來在基類中使析構函式為虛函式是如此的重要。所以強烈建議在基類中把析構函式宣告為虛函式,但是只有你寫的類並不做為基類時例外。

C 中析構函式定義成虛函式的原因

為什麼標準c 建議將虛構函式定義成虛函式,下面就來 這個問題。include class base base private char data class baseex public base baseex private char m data void main 很顯然,上述的程式有記憶體洩漏...

析構函式定義為虛函式原因

注 本文內容 於zhice163博文,感謝作者的整理。1.為什麼基類的析構函式是虛函式?在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。下面 網路 源位址 a.第一段 includeusing namespace std class clxbase clxbase ...

析構函式定義為虛函式原因

先看下面一段程式 include using namespace std class person class student public person int main 執行結果 person person student student person person student studen...