Korzystanie z VERIFY zamiast ASSERT
Załóżmy, że po uruchomieniu wersji debugowania aplikacji MFC nie ma żadnych problemów.Jednak wersji tej samej aplikacji ulega awarii, zwraca nieprawidłowe wyniki, i/lub nieprawidłowe działanie wykazuje celowość.
Ten problem może być spowodowane po umieszczeniu ważny kod w instrukcji ASSERT, aby sprawdzić, czy działa poprawnie.Ponieważ ASSERT instrukcje są przekształcane w wydanej kompilacji programu MFC, kod nie działa w wydanej kompilacji.
Jeśli używasz ASSERT celu potwierdzenia, że udało się wywołanie funkcji, należy rozważyć użycie VERIFY w zamian.Makro WERYFIKUJ ocenia argumenty w obu debugowania i buduje wersji aplikacji.
Innego preferowanego technika jest przypisać wartość zwracana przez funkcję do zmiennej tymczasowej, a następnie przetestować zmiennej w instrukcji ASSERT.
Sprawdź poniższy fragment kodu:
enum {
sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Ten kod uruchamia idealnie wersji debug aplikacji MFC.Jeśli wywołanie calloc( ) pojawia się komunikat diagnostyczny, zawierający plik i numerem wiersza się nie powiedzie,.Jednakże w handlu detalicznym budowanie aplikacji MFC:
wywołanie calloc( ) nigdy nie występuje, pozostawiając buf odinicjowany, lub
strcpy_s( )kopie "Hello, World" w losowej kawałek pamięci, ewentualnie awarii aplikacji lub że system przestanie odpowiadać, lub
free()próbę zwolnienia pamięci, która nie została przydzielona.
Aby prawidłowo używać ASSERT, przykładowy kod należy zmienić na następujące czynności:
enum {
sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Lub sprawdź można użyć zamiast tego:
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );