次の方法で共有


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

参照

参照

リリース ビルドの問題の解決