c 析構函式呼叫解析

2021-06-21 15:25:10 字數 1297 閱讀 4757

說明:

系統只會自動釋放棧內空間,而堆內空間需要使用者自己維護。c++中,除了new來的空間存放在堆內,其他均存放在棧中。當單純的建立物件的時候,物件存放在棧中,此時在程式塊的}後面,系統會自動呼叫析構函式,釋放掉棧空間。但是,如果建立了指向new來的一塊空間的指標的時候,如果在沒有顯示釋放掉new到的堆空間時,系統是不會自動呼叫析構函式去釋放棧空間中的指標的。

先呼叫父類的建構函式,後呼叫子類的建構函式。先呼叫子類的析構函式,後呼叫父類的析構函式。

如果指標宣告的為父類的指標,並且父類的析構函式不是virtual,那麼只會呼叫父類的析構函式,不會呼叫子類的析構函式。

例1:

#include class a

~a()

};class b:public a

~b()

void print()

};int main()

輸出為:

a is created

b is created

b print

b is deleted

a is deleted

例2:

#include class a

~a()

};class b:public a

~b()

void print()

};int main()

輸出為:

a is created

b is created

b print

不會自動呼叫析構函式,而且會發生記憶體洩露。

例3:

#include class a

~a()

};class b:public a

~b()

void print()

};int main()

輸出為:

a is created

b is created

a is deleted

沒有呼叫子類b的析構函式。

例4:

#include class a

virtual ~a()

};class b:public a

~b()

void print()

};int main()

輸出為:

a is created

b is created

b is deleted

a is deleted

呼叫了子類的析構函式。

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...

C 析構函式的呼叫順序

如果指標指向基類,但是指標在執行時指向派生類,則該基類必須具有虛擬析構函式,以便破壞派生類。如果沒有虛擬析構函式,則只會執行基類的析構函式。比如 base baseptr baseptr new derived 1 如果沒有新增virtual,也就是沒有虛擬析構函式,看下面 示例 include u...

有關析構函式呼叫

如果在乙個函式中定義了乙個物件 它是自動區域性物件 當這個函式被呼叫結束時,物件應該釋放,在物件釋放前自動執行析構函式。static區域性物件在函式呼叫結束時物件並不釋放,因此也不呼叫析構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫static區域性物件的析構函式。如果定義了乙個全...