delete一個void*指針:不調用析構函數


一個類對象,當生命周期結束時,該對象會調用自身的析構函數。

      一個類的指針,當使用delete函數來刪除該指針時,會調用該指針當前類型的析構函數。

      比如:

classB* pClass = (classB*)new classA;
delete pClass;

      盡管該指針實際上是classA*類型,但將其轉換為classB*類型,那么delete時,調用的是classB的析構函數。
      對於某些特殊類型,如void,int等,本身沒有析構函數,所以若將一個類指針強轉為void*,int*等,則delete時,不會調用析構函數。

     

      實際上,一個類的自然釋放過程,是先執行析構函數,再逐個釋放成員變量。    設classA有成員變量classAE,classB有成員變量classBE,則:

classB* pClass = (classB*)new classA;
delete pClass;

      會發現,先執行classB的析構函數,再執行classBE的析構函數。但實際上由於並沒有classBE的存在,故也就不執行classBE的析構函數。若內部沒有涉及嵌套的指針,那么這里並不會報錯。
     

      故delete一個指針時,務必保證該指針的當前類型就是其定義的類型。

     

      另外,子類自然釋放時,會先調用自身析構函數,再調用父類析構函數。

      設以下操作均不涉及內部指針且沒有報錯:

①   父類指針轉為子類指針,並刪除:會先執行子類析構函數,再執行父類析構函數

②   子類指針轉為父類指針,並刪除:會執行父類析構函數,子類析構函數不會得到調用

 所以,析構函數最好定義為Virtual。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM