Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Załóżmy, że podczas uruchamiania wersji debugowania aplikacji MFC nie ma problemów. Jednak wersja wydania tej samej aplikacji ulega awarii, zwraca nieprawidłowe wyniki i/lub wykazuje inne nietypowe zachowanie.
Ten problem może być spowodowany umieszczeniem ważnego kodu w instrukcji ASSERT w celu sprawdzenia, czy działa prawidłowo. Ponieważ instrukcje ASSERT są komentowane w kompilacji wydania programu MFC, kod nie jest uruchamiany w kompilacji wydania.
Jeśli używasz funkcji ASSERT do potwierdzenia, że wywołanie funkcji powiodło się, rozważ użycie funkcji VERIFY zamiast tego. Makro VERIFY ocenia własne argumenty zarówno w kompilacjach debugowania, jak i wydania aplikacji.
Inną preferowaną techniką jest przypisanie wartości zwracanej funkcji do zmiennej tymczasowej, a następnie przetestowanie zmiennej w instrukcji ASSERT.
Zapoznaj się z następującym fragmentem kodu:
enum {
sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Ten kod jest uruchamiany doskonale w wersji debugowania aplikacji MFC. Jeśli wywołanie zakończy się calloc( ) niepowodzeniem, zostanie wyświetlony komunikat diagnostyczny zawierający plik i numer wiersza. Jednak w kompilacji detalicznej aplikacji MFC:
wywołanie
calloc( )nigdy nie występuje, pozostawiającbufniezainicjowane lubstrcpy_s( )kopiuje "Hello, World" do losowego fragmentu pamięci, prawdopodobnie powodując awarię aplikacji lub powodując, że system przestaje odpowiadać lubfree()próbuje zwolnić pamięć, która nigdy nie została przydzielona.
Aby prawidłowo użyć funkcji ASSERT, przykładowy kod powinien zostać zmieniony na następujące:
enum {
sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Zamiast tego możesz użyć funkcji VERIFY:
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );