當建立乙個c++物件時,會發生兩件事:
1.為物件分配記憶體。
2.呼叫建構函式來初始化那個記憶體。
如果想對乙個void*型別指標進行delete操作,要注意這將可能成為乙個程式錯誤,除非指標所指的內容是非常簡單的,因為,它將不執行析構函式。
object* a = new object(40, 'a');
delete a;
void* b = new object(40, 'b');
delete b;
輸出為:
constructing object a, size = 40
destructing object a
constructing object b, size = 40
因為delete a知道a指向乙個object物件,所以析構函式將會被呼叫,從而釋放了分配給data的記憶體。但是,正如在進行delet b的操作中,如果通過void*型別的指針對乙個物件進行操作,則只會釋放object物件的記憶體,而不會呼叫析構函式,也就不會釋放data所指向的記憶體。編譯這個程式時,編譯器會認為我們知道所做的一切。於是我們不會看到任何警告資訊。但因此我們會丟失大量的可用記憶體。
如果在程式中發現記憶體丟失的情況,那麼就搜尋所有的delete語句並檢查被刪除指標的型別。如果是void*型別,則可能發生了引起記憶體丟失的某個因素(因為c++還有很多其他的引起記憶體丟失的因素)。
C 程式設計思想 2nd卷一 模板簡介
標頭檔案 模板定義很特殊。在template 之後的任何東西都意味著編譯器在當時不為它分配儲存空間,而是一直處於等待狀態直到被乙個模板示例告知。在編譯器和聯結器中有機制能去掉同一模板的多重定義。所以為了使用方便,幾乎總是在標頭檔案中放置全部的模板宣告和定義。當建立乙個巢狀friend類的時候,必須經...
C 程式設計思想 2nd卷一 函式過載與預設引數
在c 中,struct和class唯一的不同之處就在於,struct預設為public,而class預設為private。在使用預設引數時必須記住兩條規則 1.只有引數列表的後部引數才是可預設的,也就是說,不可以在乙個預設引數後面又跟乙個非預設的引數。2.一旦在乙個引數呼叫中開始使用預設引數,那麼這...
C 程式設計思想 2nd卷一 函式過載與預設引數
在c 中,struct和class唯一的不同之處就在於,struct預設為public,而class預設為private。在使用預設引數時必須記住兩條規則 1.只有引數列表的後部引數才是可預設的,也就是說,不可以在乙個預設引數後面又跟乙個非預設的引數。2.一旦在乙個引數呼叫中開始使用預設引數,那麼這...