ASSERT ステートメントの確認
更新 : 2007 年 11 月
デバッグ バージョンの MFC アプリケーションを実行しても問題がない場合でも、同じアプリケーションのリリース バージョンでは、クラッシュしたり、間違った結果を返したり、それ以外の異常な動作が発生したりする場合があります。
正しく動作するかどうかを確認するために ASSERT ステートメントに重要なコードを入れたことが原因で、この問題が発生することがあります。MFC プログラムのリリース ビルドでは ASSERT ステートメントがコメント化されるため、リリース ビルドではこのコードは実行されません。
関数呼び出しが成功することを確認するために 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 );