C 程式設計思想 2nd卷一 動態物件建立

2021-05-25 17:22:28 字數 689 閱讀 2944

當建立乙個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.一旦在乙個引數呼叫中開始使用預設引數,那麼這...