C 何時需要自定義析構函式呢?

2021-09-10 05:06:51 字數 2122 閱讀 5423

物件銷毀時  如果我們自己沒有寫析構方法,編譯器會幫我們寫乙個然後呼叫。

那麼問題來了,既然我不寫,編譯器會幫我寫,那我幹嘛要寫???

有木有什麼情況必須我自己寫的????

處理記憶體的時候,也就是把之前retain的物件 都release一次

#include

using namespace std;

//日期類

class date

//物件銷毀時  如果我們自己沒有寫析構方法,編譯器會幫我們寫乙個然後呼叫

#pragma 那麼問題來了,既然我不寫,編譯器會幫我寫,那我幹嘛要寫???有木有什麼情況必須我自己寫的????處理記憶體的時候,也就是把之前retain的物件 都release一次

~date()

};//員工類

class employee

//析構方法

~employee()

};//主函式

int main()

執行結果如下:

建立日期類物件都會預設被動地呼叫一次構造方法

呼叫了員工類的構造方法

員工物件銷毀了

program ended with exit code: 0

從執行結果可以知道建立的日期物件並沒有銷毀,所以有記憶體洩漏!腫麼辦?

員工銷毀,員工的析構被呼叫。但是記憶體也洩漏。。。。為什麼洩漏了?因為出了mian函式,員工物件銷毀,兩個成員變數name和日期指標birthday在員工銷毀的時候彈棧了,但是birthday指標指向的堆記憶體並沒有銷毀。所以應該在指標銷毀之前釋放指標指向的記憶體空間。那麼應該在**釋放?員工物件在銷毀的時候一定呼叫析構函式,所以在析構方法裡對指標birthday進行delete,先把堆裡開闢的記憶體空間清除掉,然後這個員工物件再銷毀,所有記憶體才沒有問題。

重寫員工的析構函式如下:

//析構方法

~employee()

再次執行結果如下:

建立日期類物件都會預設被動地呼叫一次構造方法

呼叫了員工類的構造方法

日期物件銷毀都會預設被動地呼叫一次析構方法 ~date()

員工物件銷毀了

program ended with exit code: 0

總結:析構函式,如果我們自己不寫,編譯器會幫我們寫(編譯器自己寫的析構裡面什麼都不幹)。什麼時候必須要我們自己寫?如果本類中乙個成員變數是別的物件的指標,而且這個指標不是傳進來的位址而是這個指標指向的物件,是在本類中(如果是棧裡的定位分配,也不用考慮記憶體)在堆中開闢的空間建立的。並且該指標沒有進行過delete操作,那麼久需要在析構方法中進行delete操作,此時我們就必須自己寫析構函式 。      

注意:    delete乙個沒有指向的指標會報錯

全域性區的物件在程式一開始就建立,程式結束才會銷毀。棧區的物件在呼叫函式(**塊,如for迴圈裡面)的時候才會建立,出了函式就會銷毀。  在堆中開闢空間建立的物件必須我們自己手動delete。

//主函式

int main()

cout << "***** 2 *****=" << endl;

cout << "=== 4 ====" << endl;

cout << "=== 5 ====" << endl;

return 0;

}執行結果:

***** 1 棧裡的物件 *****=

建立日期類物件都會預設被動地呼叫一次構造方法

日期物件銷毀都會預設被動地呼叫一次析構方法 ~date()

建立日期類物件都會預設被動地呼叫一次構造方法

日期物件銷毀都會預設被動地呼叫一次析構方法 ~date()

建立日期類物件都會預設被動地呼叫一次構造方法

日期物件銷毀都會預設被動地呼叫一次析構方法 ~date()

***** 2 *****=

建立日期類物件都會預設被動地呼叫一次構造方法

建立日期類物件都會預設被動地呼叫一次構造方法

建立日期類物件都會預設被動地呼叫一次構造方法

***** 3 ====

日期物件銷毀都會預設被動地呼叫一次析構方法 ~date()

日期物件銷毀都會預設被動地呼叫一次析構方法 ~date()

日期物件銷毀都會預設被動地呼叫一次析構方法 ~date()

=== 4 ====

=== 5 ====

何時需要自定義複製建構函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!一 一般情況 先看乙個例子 例程1 include using namespace std class complex complex double r,double i friend complex operator const complex ...

C 何時需要定義賦值 複製建構函式

繼承和動態記憶體分配 假設基類使用了動態記憶體分配,而且定義了析構函式 複製建構函式和賦值函式,但是在派生類中沒有使用動態記憶體分配,那麼在派生類中不需要顯示定義析構函式 複製建構函式和賦值函式。當基類和派生類採用動態記憶體分配時,派生類的析構函式 複製建構函式 賦值運算子都必須使用相應的基類方法來...

C 析構函式的定義和使用

析構函式 destructor 也是乙個特殊的成員函式,它的作用與建構函式相反,它的名字是類名的前面加乙個 符號。在c 中 是位取反運算子,從這點也可以想到 析構函式是與建構函式作用相反的函式。當物件的生命期結束時,會自動執行析構函式。具體地說如果出現以下幾種情況,程式就會執行析構函式 如果在乙個函...