delete乙個void 指標 不呼叫析構函式

2021-08-15 08:52:59 字數 1006 閱讀 6860

乙個類物件,當生命週期結束時,該物件會呼叫自身的析構函式。

乙個類的指標,當使用delete函式來刪除該指標時,會呼叫該指標當前型別的析構函式。

比如:

classb* pclass = (classb*)new classa;

delete pclass;

儘管該指標實際上是

class

a*型別,但將其轉換為

class

b*型別,那麼

delete時,呼叫的是

class

b的析構函式。

對於某些特殊型別,如void,int等,本身沒有析構函式,所以若將乙個類指標強轉為void

*,int

*等,則delete時,不會呼叫析構函式。

實際上,乙個類的自然釋放過程,是先執行析構函式,再逐個釋放成員變數。    設classa有成員變數class

ae,class

b有成員變數class

be,則:

classb* pclass = (classb*)new classa;

delete pclass;

會發現,先執行

class

b的析構函式,再執行

class

be的析構函式。但實際上由於並沒有

class

be的存在,故也就不執行

class

be的析構函式。若內部沒有涉及巢狀的指標,那麼這裡並不會報錯。

故delete乙個指標時,務必保證該指標的當前型別就是其定義的型別。

另外,子類自然釋放時,會先呼叫自身析構函式,再呼叫父類析構函式。

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

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

②   子類指標轉為父類指標,並刪除:會執行父類析構函式,子類析構函式不會得到呼叫

所以,析構函式最好定義為virtual。

空指標 void 指標 new及delete

如題分別總結這些和指標有關的一些知識點 1.指向任意型別的指標void 很多人誤以為void 型別的指標就是空指標,這是不對的。void 型指標,表示定義乙個指標,但不指定它指向那種型別的資料。void 型別的指標作為一種通用的指標,可以和其他任何型別的指標 函式指標除外 相互轉化而不需要型別強制轉...

void的乙個用途

今天看到一段案例 覺得挺有意思的 void ouch int sig 這裡在signal函式前寫了void,到底為啥要寫呢?在網上隨便搜尋了一下,沒有找到相關的回答。自己思考了一下,得出了乙個自以為是的結論 note void不能用來定義型別,但是卻可以做乙個表態,即表態signal函式,沒有必要考...

C語言中void 和C 中void 的乙個區別

1 在c語言中,型別檢查不是很嚴格,因此可以將void 賦值給 type c檔案中 int a 0 int ptr a void ptr1 ptr int ptr2 ptr1 允許將void 型別賦值給int 不會報錯2 在c 中型別檢查比較嚴格,因此不允許將void 賦值給type cpp檔案中 ...