在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運算子返回的是乙個指向所分配型別變數 ...