DEBUG_NEW和THIS_FILE
C++ 的一個(gè) 比較晦澀難懂的特點(diǎn)是你可以重載 new 操作符,并且你甚至可以給它附加參數(shù)。通常,操作符 new 只接受擬分配對(duì)象的大小:
??????? void* operator new(size_t nAlloc)
??????? {
??????????? return malloc(nAlloc);
??????? }
但你也可以隨心所欲附加參數(shù)來(lái)重載 new 操作符,只要在調(diào)用 new 時(shí)候提供這些參數(shù)即可。在各種應(yīng)用程序向?qū)?#xff08;App Wizards)中,這 是 MFC 所做的事情。一個(gè)典型的 MFC 程序(.cpp)文件頂部都有下面這樣的代碼行,通常都由應(yīng)用程序向?qū)?#xff1a;
??????? #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 以獲取兩個(gè)額外的參數(shù),比如:
??????? void* operator new(size_t nSize,
??????? LPCSTR lpszFileName, int nLine);
重載的版本與普通的 new 同樣都有表示對(duì)象大小的 size 參數(shù),但還增加了兩個(gè)參數(shù):源文件名稱和行數(shù)。因此,無(wú)論何時(shí),只要你寫(xiě):
??????? pfoo = new CFoo(..);
預(yù)處理程序便會(huì)將它轉(zhuǎn)變?yōu)?#xff1a;
??????? pfoo = new (sizeof(CFoo), THIS_FILE, __LINE__) CFoo(...);
__FILE__(用來(lái)初始化 THIS_FILE)和 __LINE__ 是專用的預(yù)處理符號(hào),它保存當(dāng)前被編譯的模塊文件名稱和行數(shù)。 其主要用途是當(dāng)你的應(yīng)用程序泄漏時(shí),MFC 能顯示一個(gè)消息。如:
??????? Shame on you! You didn''t free the CFoo object in foo.cpp, line 127!
這對(duì)于調(diào)試來(lái)說(shuō),是個(gè)巨大的福音。
轉(zhuǎn)載于:https://www.cnblogs.com/sideny/p/3297886.html
總結(jié)
以上是生活随笔為你收集整理的DEBUG_NEW和THIS_FILE的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DHTML4(select与checkb
- 下一篇: android开发------Activ