1. 構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用過程
- 創(chuàng)建子類時,先調(diào)用父類的構(gòu)造函數(shù),再調(diào)用子類的構(gòu)造函數(shù)。(構(gòu)造由內(nèi)而外)
- 銷毀子類時,先調(diào)用子類的析構(gòu)函數(shù),再調(diào)用父類的析構(gòu)函數(shù)。(析構(gòu)由外而內(nèi))
2. Apple 中重載一般的 operator new 和 operator delete (無異常)
- 在堆區(qū)創(chuàng)建對象時,先調(diào)用重載的 new ,然后再分別調(diào)用父類和子類的構(gòu)造函數(shù)。
- 在堆區(qū)銷毀對象時,先分別調(diào)用子類和父類的析構(gòu)函數(shù),然后再調(diào)用重載的 delete 。
3. Apple 中重載一般的 operator new 和 operator delete (構(gòu)造有異常)
當(dāng)創(chuàng)建對象產(chǎn)生異常時,會對對象調(diào)用 delete 。其中銷毀對象時,只調(diào)用了父類的析構(gòu)函數(shù),然后調(diào)用 operator delete 來釋放申請的內(nèi)存。異常對象在異常處理完成后再被銷毀。
4. Apple類中 placement new 調(diào)用的 ctor 有異常
當(dāng) placement new 所調(diào)用的 ctor 拋出異常,會調(diào)用相對應(yīng)的 operator (placement) delete 來處理異常,其用途是釋放與之對應(yīng)的 placement new 分配所得的內(nèi)存。
5. Apple類中 placement new 調(diào)用的 ctor 無異常
當(dāng) placement new 所調(diào)用的 ctor 無異常,會調(diào)用operator delete(void* ptr) 來處理異常。
6. Apple類中 placement new 調(diào)用的 ctor 有異常(無對應(yīng) delete )
當(dāng) placement new 所調(diào)用的 ctor 拋出異常,而沒有與之對應(yīng)的 operator (placement) delete 來處理異常,則默認不進行異常處理。因此保險起見,placement new 和 placement delete 必須要成對出現(xiàn),否則就會產(chǎn)生內(nèi)存泄漏。
程序運行結(jié)果:
