Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Stel dat wanneer u de foutopsporingsversie van uw MFC-toepassing uitvoert, er geen problemen zijn. De releaseversie van dezelfde toepassing loopt echter vast, retourneert onjuiste resultaten en/of vertoont een ander abnormaal gedrag.
Dit probleem kan worden veroorzaakt wanneer u belangrijke code in een ASSERT-instructie plaatst om te controleren of deze correct wordt uitgevoerd. Omdat ASSERT-instructies als commentaar worden opgenomen in een release-build van een MFC-programma, wordt de code niet uitgevoerd in een release-build.
Als u ASSERT gebruikt om te bevestigen dat een functie-aanroep is geslaagd, kunt u in plaats daarvan CONTROLEREN gebruiken. De macro VERIFY evalueert zijn eigen argumenten in zowel foutopsporing als release-builds van de toepassing.
Een andere voorkeurstechniek is het toewijzen van de retourwaarde van de functie aan een tijdelijke variabele en vervolgens de variabele testen in een ASSERT-instructie.
Bekijk het volgende codefragment:
enum {
sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Deze code wordt perfect uitgevoerd in een foutopsporingsversie van een MFC-toepassing. Als de aanroep naar calloc( ) mislukt, wordt er een diagnostisch bericht weergegeven dat het bestand en regelnummer bevat. Echter, in een retailversie van een MFC-toepassing:
de oproep naar
calloc( )vindt nooit plaats, waardoorbufniet wordt geïnitialiseerd, ofstrcpy_s( )kopieert 'Hello, World' naar een willekeurig stukje geheugen, mogelijk crasht de toepassing of zorgt ervoor dat het systeem niet meer reageert, offree()probeert geheugen vrij te geven dat nooit werd toegewezen.
Als u ASSERT correct wilt gebruiken, moet het codevoorbeeld worden gewijzigd in het volgende:
enum {
sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
U kunt ook VERIFIËREN gebruiken:
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );