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