關(guān)于析構(gòu)函數(shù)的問題
如果我們定義了一個(gè)析構(gòu)函數(shù),系統(tǒng)就不會(huì)再定義了嗎?如果是這樣的話,要是我們定義析構(gòu)函數(shù)時(shí)里面不寫任何語句,系統(tǒng)是怎么銷毀對(duì)象的呢?是不是系統(tǒng)里本來就有這個(gè)操作,只要我們寫出“~類名”這個(gè)語句,就會(huì)自動(dòng)執(zhí)行?
如果我們定義了一個(gè)析構(gòu)函數(shù),系統(tǒng)就不會(huì)再定義了嗎?如果是這樣的話,要是我們定義析構(gòu)函數(shù)時(shí)里面不寫任何語句,系統(tǒng)是怎么銷毀對(duì)象的呢?是不是系統(tǒng)里本來就有這個(gè)操作,只要我們寫出“~類名”這個(gè)語句,就會(huì)自動(dòng)執(zhí)行?
2019-07-16
舉報(bào)
2020-02-26
我用以下實(shí)驗(yàn)來解決一下這個(gè)問題,好久之前的欸,。
一、我不加入析構(gòu)函數(shù)讓系統(tǒng)自動(dòng)生成默認(rèn)的,看一下效果
1.class.h中:
不自定義~Teacher(),并設(shè)一個(gè)指針p;
2.class.cpp中:
構(gòu)造函數(shù)申請(qǐng)一片空間,并給空間賦值10;
3.main.c中:
我定義一個(gè)函數(shù)test,返回值為指針,函數(shù)中申請(qǐng)一個(gè)對(duì)象,將對(duì)象的指針p作為返回值。這里我解釋一下,我們都知道有局部變量,并且前面有講到??臻g,局部變量就存在??臻g中,會(huì)隨著函數(shù)返回而釋放,即對(duì)象被銷毀了。于是會(huì)調(diào)用系統(tǒng)自動(dòng)生成的析構(gòu)函數(shù)。
前面也學(xué)到new申請(qǐng)的是堆空間,它不會(huì)隨著函數(shù)返回而消失,如果沒有delete的話。我用主函數(shù)定義一個(gè)指針來指向這個(gè)new申請(qǐng)的空間,防止它走失。這時(shí)候,就可以查看main函數(shù)中指針p所指空間是否為10,就可以來判斷這片空間是否被銷毀了。
運(yùn)行結(jié)果如下:
顯然,依舊存在數(shù)據(jù)。所以可以得到,系統(tǒng)默認(rèn)的析構(gòu)函數(shù)他不會(huì)delete,也不會(huì)p=NULL。
當(dāng)然,我還是要繼續(xù)進(jìn)行下面的實(shí)驗(yàn),如果我們自定義析構(gòu)函數(shù)加入delete和NULL,運(yùn)行結(jié)果是怎么樣的?是不是空間被銷毀導(dǎo)致主函數(shù)獲得的返回空間是亂碼:
二、我加入自定義析構(gòu)函數(shù),手動(dòng)delete,看一下效果
1.class.h與class.cpp
2.運(yùn)行結(jié)果
可以看到,函數(shù)結(jié)束后調(diào)用了一次~Teacher(),并且主函數(shù)的p指針最終指向的數(shù)據(jù)是一堆我們看不懂的亂碼,也就是說,空間內(nèi)數(shù)據(jù)或者空間其實(shí)已被銷毀了。
總結(jié):
????????綜上所述,如你所說的,如果自己定義一個(gè)析構(gòu)函數(shù)里面什么都不寫,確實(shí)銷毀的時(shí)候什么都不執(zhí)行。
????????而且系統(tǒng)默認(rèn)生成的析構(gòu)函數(shù)也不會(huì)銷毀掉new申請(qǐng)的堆空間,大工程如果大量申請(qǐng)堆空間而沒有銷毀,會(huì)占用很大的內(nèi)存資源。
????????我覺得這個(gè)方法或許是用來匹配自己其他方法中new申請(qǐng)的空間或者其他,統(tǒng)一于對(duì)象銷毀時(shí)執(zhí)行delete或者其他刪除操作,延長(zhǎng)申請(qǐng)的這塊空間的生命周期,從對(duì)象創(chuàng)建到對(duì)象銷毀整個(gè)過程中,都能使用這塊空間。
????
希望對(duì)你有幫助。大力感謝制作視頻的老師,太厲害了!
2019-07-17
析構(gòu)函數(shù)在對(duì)象銷毀時(shí)調(diào)用,要銷毀對(duì)象需要自己寫銷毀代碼,系統(tǒng)不會(huì)自動(dòng)銷毀對(duì)象,個(gè)人理解