C6250
Mise à jour : novembre 2007
C6250
Avertissement C6250 : L'appel de <fonction> sans l'indicateur MEM_RELEASE peut libérer de la mémoire mais pas les descripteurs d'adresses virtuelles (VAD) ; cela peut provoquer des fuites dans l'espace d'adressage
Cet avertissement indique qu'un appel à VirtualFree sans l'indicateur MEM_RELEASE annule uniquement la validation des pages, mais ne les libère pas. Pour annuler la validation et libérer des pages, utilisez l'indicateur MEM_RELEASE dans l'appel à VirtualFree. Si des pages de la zone sont validées, la fonction annule d'abord leur validation puis les libère. Une fois cette opération terminée, les pages sont dans l'état libre. Si vous spécifiez cet indicateur, dwSize doit être égal à zéro, et lpAddress doit pointer vers l'adresse de base retournée par la fonction VirtualAlloc lorsque la zone a été réservée. La fonction échoue si l'une ou l'autre de ces conditions n'est pas remplie.
Vous pouvez ignorer cet avertissement si votre code libère ultérieurement l'espace d'adressage en appelant VirtualFree avec l'indicateur MEM_RELEASE.
Exemple
L'exemple de code suivant génère cet avertissement :
#include <windows.h>
#include <stdio.h>
#define PAGELIMIT 80
DWORD dwPages = 0; // count of pages
DWORD dwPageSize; // page size
VOID f( )
{
LPVOID lpvBase; // base address of the test memory
SYSTEM_INFO sSysInfo; // system information
GetSystemInfo(&sSysInfo);
dwPageSize = sSysInfo.dwPageSize;
// Reserve pages in the process's virtual address space
lpvBase = VirtualAlloc(
NULL, // system selects address
PAGELIMIT*dwPageSize, // size of allocation
MEM_RESERVE,
PAGE_NOACCESS);
//
// code to access memory
// ...
if (lpvBase != NULL)
{
if (VirtualFree( lpvBase, 0, MEM_DECOMMIT )) // decommit pages
{
puts ("MEM_DECOMMIT Succeeded");
}
else
{
puts("MEM_DECOMMIT failed");
}
}
else
{
puts("lpvBase == NULL");
}
}
Pour corriger cet avertissement, utilisez l'exemple de code suivant :
#include <windows.h>
#include <stdio.h>
#define PAGELIMIT 80
DWORD dwPages = 0; // count of pages
DWORD dwPageSize; // page size
VOID f( )
{
LPVOID lpvBase; // base address of the test memory
SYSTEM_INFO sSysInfo; // system information
GetSystemInfo(&sSysInfo);
dwPageSize = sSysInfo.dwPageSize;
// Reserve pages in the process's virtual address space
lpvBase = VirtualAlloc(
NULL, // system selects address
PAGELIMIT*dwPageSize, // size of allocation
MEM_RESERVE,
PAGE_NOACCESS);
//
// code to access memory
// ...
if (lpvBase != NULL)
{
if (VirtualFree(lpvBase, 0,MEM_RELEASE )) // decommit & release
{
// code ...
}
else
{
puts("MEM_RELEASE failed");
}
}
else
{
puts("lpvBase == Null ");
// code...
}
}