DEBUG_NEW和THIS_FILE
C++ 的一個 比較晦澀難懂的特點是你可以重載 new 操作符,并且你甚至可以給它附加參數。通常,操作符 new 只接受擬分配對象的大小:
??????? void* operator new(size_t nAlloc)
??????? {
??????????? return malloc(nAlloc);
??????? }
但你也可以隨心所欲附加參數來重載 new 操作符,只要在調用 new 時候提供這些參數即可。在各種應用程序向導(App Wizards)中,這 是 MFC 所做的事情。一個典型的 MFC 程序(.cpp)文件頂部都有下面這樣的代碼行,通常都由應用程序向導生成:
??????? #ifdef _DEBUG
??????? #define new DEBUG_NEW
??????? #undef THIS_FILE
??????? static char THIS_FILE[] = __FILE__;
??????? #endif
MFC 將 new 重定義為 DEBUG_NEW。但 DEBUG_NEW 是什么? afx.h 道出了原委:
??????? // (simplified)
??????? #ifdef _DEBUG
??????? # define DEBUG_NEW new(THIS_FILE, __LINE__)
??????? #else
??????? # define DEBUG_NEW new
??????? #endif
在 debug 生成模式中,MFC 重載了操作符 new 以獲取兩個額外的參數,比如:
??????? void* operator new(size_t nSize,
??????? LPCSTR lpszFileName, int nLine);
重載的版本與普通的 new 同樣都有表示對象大小的 size 參數,但還增加了兩個參數:源文件名稱和行數。因此,無論何時,只要你寫:
??????? pfoo = new CFoo(..);
預處理程序便會將它轉變為:
??????? pfoo = new (sizeof(CFoo), THIS_FILE, __LINE__) CFoo(...);
__FILE__(用來初始化 THIS_FILE)和 __LINE__ 是專用的預處理符號,它保存當前被編譯的模塊文件名稱和行數。 其主要用途是當你的應用程序泄漏時,MFC 能顯示一個消息。如:
??????? Shame on you! You didn''t free the CFoo object in foo.cpp, line 127!
這對于調試來說,是個巨大的福音。
轉載于:https://www.cnblogs.com/sideny/p/3297886.html
總結
以上是生活随笔為你收集整理的DEBUG_NEW和THIS_FILE的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DHTML4(select与checkb
- 下一篇: android开发------Activ