Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предположим, что отладочная версия приложения 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 );
Можно также вместо ASSERT использовать VERIFY:
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );