c 中的過載全域性new,delete

2021-05-24 13:41:01 字數 1370 閱讀 7320

這樣我們每次呼叫new,比如int * pn = new int;被編譯器替換成了int * pn = new (__file__, __line__) int,從而呼叫我們定義的operator new,這種辦法確實很妙。需要交代的是,對於陣列同樣適用,而是在編譯的是後由編譯器計算出所需要的長度呼叫我們定義的operator new函式。

對於delete,我們無需使用巨集定義,只要過載operator delete就可以了,然而我們需要過載兩個delete:

void operator delete(void * p)

void operator delete (void * p)

其實後面乙個函式的內容和前面的內容一樣,但為了支援陣列的釋放,我們必須是要定義的。那麼我們只是簡單的free(p)編譯器咋知道我們釋放的陣列,還是單個物件了,這個不用我們操心了,我們只要提供給free函式乙個申請記憶體的首位址就可以了。因為在用malloc申請的時候,我們也把數組裝換為記憶體大小了。

由此我們可以得出下面的推斷:用int * pn = new int [100];的空間,用delete pn釋放和delete pn釋放效果一樣。然而那麼既然這兩種方式一樣,那還要delete 幹什麼,其實delete 有另外的作用就是類物件陣列的釋放,編譯器把delete 解釋為呼叫物件的析構函式,這個是通過迴圈實現的,最後釋放掉申請的記憶體。

既然我們已經跟蹤了new和delete,那麼就可以比較容易的判斷申請的記憶體是否最後得到釋放,要完成它,我們還需要乙個鍊錶,或者其它,當我們申請一塊記憶體的時候加入到鍊錶中,釋放一塊空間的時候,從鍊錶中刪除和釋放記憶體首位址相同的節點就可以了,最後理想的情況是鍊錶為空,如果不為空,那就說明記憶體發生洩露(memory leaks)了。

完整**:

c 中的過載

c 中的過載 c 中的過載包含函式過載和運算子過載,編譯時的多型性就是由這兩種過載實現的。一 函式過載 函式過載 兩個以上的函式有相同的函式名,但是函式的形參個數或者型別不同,編譯器會根據實參與形參的型別和個數進行最佳匹配,自動決定呼叫哪乙個函式。int add int m,int n 函式呼叫前必...

C 中的過載

函式過載 用同一函式名定義不同的函式,當函式名和不同的引數搭配時函式的含義不同。函式過載至少滿足一下的乙個條件 引數個數不同 引數型別不同 引數順序不同 函式的返回值不是函式過載的判斷標準 預設引數和過載在一起,會報錯,產生二義性 void func inta,intb intc 0 void fu...

c 中的過載

出現在相同作用域的二個函式如果具有相同的名字而形參不同,則稱為過載函式。在這個定義中有二個注意點 1.是在相同的作用域,如果,不在相同的作用域,即使形參不同zhe,也不算作是過載函式 比如一下的例子 void print const string s void print double d void...