共用方式為


使用 VERIFY 取代 ASSERT

假設當您執行 MFC 應用程式的偵錯版本時,沒有任何問題。 不過,相同應用程式的版本當機、傳回不正確的結果,以及/或呈現一些其他異常行為。

當您將重要程式碼放在 ASSERT 語句中,確認它是否正確執行時,可能會造成此問題。 由於 ASSERT 語句會在 MFC 程式的發行組建中批註化,因此程式碼不會在發行組建中執行。

如果您使用 ASSERT 來確認函式呼叫成功,請考慮改用 VERIFY 。 VERIFY 宏會在應用程式的偵錯和發行組建中評估自己的引數。

另一個慣用的技術是將函式的傳回值指派給暫存變數,然後在 ASSERT 語句中測試變數。

檢查下列程式碼片段:

enum {
    sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

此程式碼會在 MFC 應用程式的偵錯版本中完美執行。 如果呼叫 calloc( ) 失敗,會出現包含檔案和行號的診斷訊息。 不過,在 MFC 應用程式的零售組建中:

  • 永不發生呼叫 calloc( ) 、保留 buf 未初始化或

  • strcpy_s( ) 將 「 Hello, World 」 複製到隨機記憶體片段,可能會損毀應用程式或導致系統停止回應,或

  • free() 嘗試釋放從未配置的記憶體。

若要正確使用 ASSERT,程式碼範例應該變更為下列專案:

enum {
    sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

或者,您可以改用 VERIFY:

enum {
    sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

另請參閱

解決發行組建的問題