#ifdef _DEBUG #define new DEBUG_NEW #endif的解释
生活随笔
收集整理的這篇文章主要介紹了
#ifdef _DEBUG #define new DEBUG_NEW #endif的解释
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在用vc時,利用AppWizard會產生如下代碼:
[cpp] view plain copy print?#ifdef?_DEBUG?? #define?new?DEBUG_NEW?? #undef?THIS_FILE?? static?char?THIS_FILE[]?=?__FILE__;?? #endif??
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif對于
[cpp] view plain copy print?#define?new?DEBUG_NEW??
#define new DEBUG_NEW
#ifdef?_DEBUG?? void*?AFX_CDECL?operator?new(size_t?nSize,?LPCSTR?lpszFileName,?int?nLine);?? #define?DEBUG_NEW?new(THIS_FILE,?__LINE__)?? #else?? #define?DEBUG_NEW?new?? #endif??
#ifdef _DEBUG
void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
#define DEBUG_NEW new(THIS_FILE, __LINE__)
#else
#define DEBUG_NEW new
#endif這樣就很清楚了,當在
debug模式下時,我們分配內存時的new被替換成DEBUG_NEW,而這個DEBUG_NEW
不僅要傳入內存塊的大小,還要傳入源文件名和行號,這就有個好處,即當發生
內存泄漏時,我們可以在調試模式下定位到該問題代碼處。若刪掉該句,就不能進行定位了。而在
release版本下的new就是簡單的new,并不會傳入文件名和行號。
因此,我們在開發代碼階段,保留上述代碼是值得的。
================================#ifdef?_DEBUG?? virtual?void?AssertValid()?const;?//assert(斷言)valid(有效的,正確的)?? virtual?void?Dump(CDumpContext&?dc)?const;?//存儲上下文?? #endif??
#ifdef _DEBUG
virtual void AssertValid() const; //assert(斷言)valid(有效的,正確的)
virtual void Dump(CDumpContext& dc) const; //存儲上下文
#endif這兩個函數是調試用的,第一個函數檢查可用性,即是否有效
第二個函數如果未更改的話,最終調用的是Cwnd::Dump();
輸出窗口類名,標題名等一系列信息(在輸出窗口中)
[cpp] view plain copy print?#ifdef?_DEBUG?? #endif??
#ifdef _DEBUG
#endif這是條件編譯,即如果有#define _DEBUG這兩個函數會編譯,否則忽略,
當你用debug生成時(相對于release)開發環境則自動的加上這個宏定義,這兩個函數有效。
#ifdef?_DEBUG?//?判斷是否定義_DEBUG??? #undef?THIS_FILE?//?取消THIS_FILE的定義??? static?char?THIS_FILE[]=__FILE__;?//?定義THIS_FILE指向文件名??? #define?new?DEBUG_NEW?//?定義調試new宏,取代new關鍵字??? #endif?//?結束??
#ifdef _DEBUG // 判斷是否定義_DEBUG
#undef THIS_FILE // 取消THIS_FILE的定義
static char THIS_FILE[]=__FILE__; // 定義THIS_FILE指向文件名
#define new DEBUG_NEW // 定義調試new宏,取代new關鍵字
#endif // 結束如果定義了_DEBUG,表示在調試狀態下編譯,因此相應修改了兩個符號的定義
THIS_FILE是一個char數組全局變量,字符串值為當前文件的全路徑,這樣在Debug版本中當程序出錯時出錯處理代碼可用這個變量告訴你是哪個文件中的代碼有問題。
定義 _DEBUG后,由于定義了_DEBUG,編譯器確定這是一個調試,編譯#ifdef _DEBUG和#endif之間的代碼。#undef 表示清除當前定義的宏,使得THIS_FILE無定義。
__FILE__ 是編譯器能識別的事先定義的ANSI C 的6個宏之一。#define new DEBUG_NEW
DEBUG_NEW定位內存泄露并且跟蹤文件名.
#ifdef?_DEBUG?//如果是debug狀態??? #undef?THIS_FILE?//清除THIS_FILE??? static?char?THIS_FILE[]=__FILE__;?//定義THIS_FILE為__FILE__(這是當前文件全路徑名字)??? #define?new?DEBUG_NEW?//定義new為DEBUG_NEW(這個可以檢測到內?//存泄露之類的問題,其實就是可以使用crt開頭的那幾個調試函數)??? #endif??
#ifdef _DEBUG //如果是debug狀態
#undef THIS_FILE //清除THIS_FILE
static char THIS_FILE[]=__FILE__; //定義THIS_FILE為__FILE__(這是當前文件全路徑名字)
#define new DEBUG_NEW //定義new為DEBUG_NEW(這個可以檢測到內 //存泄露之類的問題,其實就是可以使用crt開頭的那幾個調試函數)
#endifANSI C 的6個宏:6個分別是
[cpp] view plain copy print?__DATE__?? __FILE__?? __LINE__?? __STDC__?? __TIME__?? __TIMESTAMP__??
__DATE__
__FILE__
__LINE__
__STDC__
__TIME__
__TIMESTAMP__編譯C++程序時,編譯器自動定義了一個預處理器名字__cplusplus(代表C++程序),自動定義名字__STDC__(代表C程序),__LINE__記錄文件已經被編譯的行數__FILE__包含正在被編譯的文件的名字,另外兩個預定義名字分別包含當前被編譯文件的編譯時間__TIME__ 和日期__DATE__。
[cpp] view plain copy print?
[cpp] view plain copy print?
首先看msdn的解釋:
再查看定義:
[cpp] view plain copy print?因此,我們在開發代碼階段,保留上述代碼是值得的。
================================
補充:
#define new DEBUG_NEW
當進行對象轉儲時,用 DEBUG_NEW 分配的每個對象均將顯示被分配到的文件和行號,使您可以查明內存泄漏源。
MFC 框架的“Debug”版本自動使用 DEBUG_NEW,但代碼不自動使用它。如果希望利用 DEBUG_NEW 的好處,則必須顯式使用 DEBUG_NEW 或 #define new,如上所示。
情況1:
[cpp] view plain copy print?第二個函數如果未更改的話,最終調用的是Cwnd::Dump();
輸出窗口類名,標題名等一系列信息(在輸出窗口中)
[cpp] view plain copy print?
當你用debug生成時(相對于release)開發環境則自動的加上這個宏定義,這兩個函數有效。
情況2:
[cpp] view plain copy print?THIS_FILE是一個char數組全局變量,字符串值為當前文件的全路徑,這樣在Debug版本中當程序出錯時出錯處理代碼可用這個變量告訴你是哪個文件中的代碼有問題。
定義 _DEBUG后,由于定義了_DEBUG,編譯器確定這是一個調試,編譯#ifdef _DEBUG和#endif之間的代碼。#undef 表示清除當前定義的宏,使得THIS_FILE無定義。
__FILE__ 是編譯器能識別的事先定義的ANSI C 的6個宏之一。#define new DEBUG_NEW
DEBUG_NEW定位內存泄露并且跟蹤文件名.
情況3:
[cpp] view plain copy print?[cpp] view plain copy print?
總結
以上是生活随笔為你收集整理的#ifdef _DEBUG #define new DEBUG_NEW #endif的解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用电脑上自带指纹识别嵌入程序中_Win
- 下一篇: react 组件