說明:
系統只會自動釋放棧內空間,而堆內空間需要使用者自己維護。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區域性物件的析構函式。如果定義了乙個全...