vc中new和delete操作符的過載

2021-04-02 23:58:54 字數 1516 閱讀 7243

在c++中過載new和delete操作符可以給程式帶來更靈活的儲存控制,對於遊戲設計等對效率要求較高的應用而言是必不可少的。一般的c++書籍中也會介紹它們的應用和實現,然而在vc中實現卻有幾個必須注意的地方,否則編譯會出現問題。

首先,vc在每個自動生成的cpp檔案中都會加入如下**:

#ifdef _debug

#undef this_file

static char this_file=__file__;

#define new debug_new

#endif

從上面紅色的字型可以看出,這時的new在debug模式下被定義成了debug_new,所以實現new函式的**應該放在此定義之前,否則編譯會報錯。

那麼debug_new又是什麼東西呢?在afx.h檔案中可以找到答案:

#define debug_new new(this_file, __line__)

因而,在debug模式下如果我們呼叫如下**:

cwnd* pwnd = new cwnd;

就變成了

cwnd* pwnd = new(this_file, __line__) cwnd;

上面的**相當於呼叫了new(sizeof(cwnd), this_file, __line__)函式,它的原型為:

void* operator new(size_t, lpctstr, int);

所以在debug模式下我們的new操作符必須定義為如上形式。

如果實現了void* operator new(size_t, lpctstr, int)操作符,最好是同時實現與之相對應的

void operator delete(void* p, lpctstr, int)

操作符,否則編譯器會報乙個警告錯誤:no matching operator delete found; memory will not be freed if initialization throws an exception。

如果過載了類的new和delete操作符,必須將他們宣告為靜態成員。這是因為對於非靜態的成員函式,編譯器會在其末尾新增乙個this引數;另外,呼叫new的時候,類還沒有構造。以上都導致了對靜態宣告的要求。

如果要過載全域性的new和delete操作符,只需實現以下函式(release模式下):

inline void * __cdecl operator new (size_t size);

inline void __cdecl operator delete (void *p);

不需要進行宣告,只要在某個地方實現上述函式,那麼所有的new操作都會呼叫我們實現的函式進行。但在release模式下有個問題:new和delete的呼叫次數不一致。在我實現的乙個測試程式中(vc6.0,預設自動生成的多文件程式),new被呼叫了5次,而delete只被呼叫了3次,最開始兩次呼叫的new操作沒有相應的delete操作。不知道是不是呼叫了其他的delete原型。

vc中new和delete操作符的過載 參考資料

在c 中過載new和delete操作符可以給程式帶來更靈活的儲存控制,對於遊戲設計等對效率要求較高的應用而言是必不可少的。一般的c 書籍中也會介紹它們的應用和實現,然而在vc中實現卻有幾個必須注意的地方,否則編譯會出現問題。首先,vc在每個自動生成的cpp檔案中都會加入如下 ifdef debug ...

C 中的new和delete操作符

在c語言中使用malloc 和free 等來進行動態記憶體管理,而在c 中使用操作符new和delete 來做相同的工作。操作符new分配乙個空間,new 分配乙個陣列,delete釋放由new分配的單一空間,delete 釋放由new 分配的陣列。注意 deltet和new是操作符而不是庫函式 在...

C 中new和delete的用法

首先,new和delete運算子是用於動態分配和撤銷記憶體的運算子。一 new用法 1.開闢單變數位址空間 使用new運算子時必須已知資料型別,new運算子會向系統堆區申請足夠的儲存空間,如果申請成功,就返回該記憶體塊的首位址,如果申請不成功,則返回零值。new運算子返回的是乙個指向所分配型別變數 ...