物件銷毀時 如果我們自己沒有寫析構方法,編譯器會幫我們寫乙個然後呼叫。
那麼問題來了,既然我不寫,編譯器會幫我寫,那我幹嘛要寫???
有木有什麼情況必須我自己寫的????
處理記憶體的時候,也就是把之前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 中 是位取反運算子,從這點也可以想到 析構函式是與建構函式作用相反的函式。當物件的生命期結束時,會自動執行析構函式。具體地說如果出現以下幾種情況,程式就會執行析構函式 如果在乙個函...