CRT 判斷提示
這個主題適用於:
版本 |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
![]() |
![]() |
![]() |
僅適用原生 |
![]() |
Pro、Premium 和 Ultimate |
![]() |
![]() |
![]() |
僅適用原生 |
![]() |
CRTDBG.H 標頭檔 (Header File) 會定義檢查判斷提示的 _ASSERT 和 _ASSERTE 巨集。
巨集 |
結果 |
---|---|
_ASSERT |
如果指定的運算式評估結果是 FALSE,結果會是 _ASSERT 的檔名和行號。 |
_ASSERTE |
與 _ASSERT 狀況相同,加上要判斷提示的運算式之字串表示。 |
_ASSERTE 功能較強大,因為它會報告結果為 FALSE 的判斷提示運算式。 這點足以在無須參考原始程式碼情況下辨識問題。 然而,應用程式的偵錯版本會包含每個使用 _ASSERTE 的判斷提示運算式的字串常數。 如果您使用許多 _ASSERTE 巨集,這些字串運算式 (String Expression) 會需要相當多的記憶體。 如果這證實會變成一種問題,請使用 _ASSERT 以節省記憶體。
當定義 _DEBUG 時,_ASSERTE 巨集便會依下列方式定義:
#define _ASSERTE(expr) \
do { \
if (!(expr) && (1 == _CrtDbgReport( \
_CRT_ASSERT, __FILE__, __LINE__, #expr))) \
_CrtDbgBreak(); \
} while (0)
如果判斷提示運算式結果為 FALSE,則會呼叫 _CrtDbgReport 以報告判斷提示失敗 (使用預設的訊息對話方塊)。 如果您選擇訊息對話方塊裡的 [重試],_CrtDbgReport 會傳回 1,而 _CrtDbgBreak 會經由 DebugBreak 呼叫偵錯工具。
取代 printf
_ASSERTE 允許您取代下列程式碼:
#ifdef _DEBUG
if ( someVar > MAX_SOMEVAR )
printf( "OVERFLOW! In NameOfThisFunc( ),
someVar=%d, otherVar=%d.\n",
someVar, otherVar );
#endif
成為單一陳述式:
_ASSERTE(someVar <= MAX_SOMEVAR);
檢查堆積損毀
下列範例使用 _CrtCheckMemory 來檢查堆積的損毀:
_ASSERTE(_CrtCheckMemory());
檢查指標有效性
下列範例使用 _CrtIsValidPointer 來驗證指定記憶體範圍對於讀取或撰寫是否有效。
_ASSERTE(_CrtIsValidPointer( address, size, TRUE );
下列範例使用 _CrtIsValidHeapPointer 來驗證指向本機堆積裡記憶體的指標 (這是指由 C 執行階段程式庫的執行個體 (Instance) 建立和管理的堆積 ─ 也就是 DLL 可以有它自己的程式庫執行個體,因此它自己的堆積是在應用程式堆積的外部)。 這個判斷提示不僅可捕捉 Null 或超出範圍的位址,還可捕捉靜態變數、堆疊變數和任何其他非本機記憶體的指標。
_ASSERTE(_CrtIsValidPointer( myData );
檢查記憶體區塊
下列範例使用 _CrtIsMemoryBlock 來驗證記憶體區塊是本機堆積且擁有有效的區塊類型。
_ASSERTE(_CrtIsMemoryBlock (myData, size, &requestNumber, &filename, &linenumber));