共用方式為


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));

請參閱

概念

判斷提示