虛析構函式與記憶體洩漏

2021-09-02 22:30:21 字數 1041 閱讀 3130

1,為什麼要用虛函式? 因為在使用基類的引用或指標呼叫乙個虛成員函式時會執行動態繫結。這樣,程式直到執行時才能知道到底呼叫了**的虛函式,從而實現了多型。

2,base *pbase = new son;的執行順序:首先呼叫了基類的預設建構函式(由派生類構造函式呼叫),再呼叫了派生類的預設建構函式。當然,由於基類的析構函式沒有設定為虛而造成的記憶體洩漏大多也是由於有這樣的語句才會造成。

3,base *pbase = new son;這條語句後發現pbase並不能呼叫派生類中新增的函式,為什麼要用這樣的語句呢?因為它可以實現多型性,即向不同的派生類物件傳送同乙個訊息,不同的物件在接受時會產生不同的行為(通過呼叫各自相同名字不同作用的虛函式實現)。

4,執行delete pbase;如果基類的析構函式為虛,則先執行派生類的析構函式,再執行基類的析構函式

如果基類的析構函式不為虛,則只執行基類的析構函式。此時洩漏記憶體

// 虛析構函式造成記憶體洩漏的一些探索

#include using namespace std;

class base

void cout1() // 基類中的乙個非虛函式

virtual void cout2() // 基類的乙個虛函式

virtual ~base() // 基類的虛析構函式 };

class son : public base

void cout1() // 派生類的非虛函式

virtual void cout2() // 派生類重寫虛函式

void cout3() // 派生類中新增的函式

~son() };

void main()

c 虛析構函式 避免記憶體洩漏

c 虛析構函式 虛析構函式 1 虛析構函式即 定義宣告析構函式前加virtual 修飾,如果將基類的析構函式宣告為虛析構函式時,由該基類所派生的所有派生類的析構函式也都自動成為虛析構函式。2 基類指標pbase 指向用new動態建立的派生類物件child時,用 delete pbase 刪除物件分兩...

虛析構函式與非虛析構函式問題!

class a class b public a int main 這種情況下,輸出結果我們都知道,是先執行子類的析構函式,後執行父類的析構函式,所以輸出是 b 和 a class a class b public a int main 這種情況下,我是記住了,析構函式在執行的時候,只有乙個執行,但...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...