C6250
Advertencia C6250: Si llama a <función> VirtualFree sin la marca 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 marcador 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 marcador 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 marcador, 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 marcador MEM_RELEASE.
Para obtener más información, vea VirtualAlloc y VirtualFree.
El uso de las opciones VirtualAlloc y VirtualFree tiene muchos riesgos en cuanto a pérdidas de memoria y excepciones.Para evitar todos estos tipos de problemas de pérdidas de memoria y excepciones, use los mecanismos proporcionados por la Biblioteca de plantillas estándar (STL) de C++.Estos incluyen shared_ptr, unique_ptr y vector.Para obtener más información, vea Punteros inteligentes (C++ moderno) y Referencia de biblioteca estándar de C++.
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...
}
}