C6250
Actualización: noviembre 2007
C6250
Advertencia C6250: Si llama a <función> sin la etiqueta MEM_RELEASE se podrá liberar memoria pero no descriptores de dirección (VAD), lo que ocasionará pérdidas de espacio de dirección
Esta advertencia indica que una llamada a VirtualFree sin el indicador MEM_RELEASE sólo anula el registro de las páginas, y no las libera. Para anular el registro de las páginas y liberarlas, utilice el indicador MEM_RELEASE en una llamada a VirtualFree. Si cualquiera de las páginas de la región está confirmada, la función anula el registro y luego las libera. Después de esta operación, las páginas quedan en el estado libre. Si especifica este indicador, dwSize debe ser cero y lpAddress debe señalar a la dirección base devuelta por la función VirtualAlloc al reservar la región. Se produce un error en la función si no se cumple cualquiera de estas condiciones.
Puede omitir esta advertencia si el código libera el espacio de direcciones más adelante llamando a VirtualFree con el indicador MEM_RELEASE.
Ejemplo
El siguiente ejemplo de código genera esta advertencia:
#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");
}
}
Para corregir esta advertencia, utilice el siguiente código de ejemplo:
#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...
}
}