Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Llamar a "VirtualFree" sin la marca de MEM_RELEASE puede liberar memoria, pero no descriptores de dirección (VAD); da como resultado pérdidas de espacio de direcciones
Comentarios
Esta advertencia indica que una llamada a VirtualFree sin la MEM_RELEASE marca solo descommite las páginas y no las libera. Para descommitar y liberar páginas, use la MEM_RELEASE marca de la 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 alguna 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 VirtualAlloc y VirtualFree tiene muchos problemas en términos de fugas de memoria y excepciones. Para evitar estos tipos de posibles fugas por completo, use los mecanismos proporcionados por la biblioteca estándar de C++ (STL). Entre ellos se incluyen shared_ptrlos contenedores , unique_ptry , como vector. Para más información, consulte los artículos sobre punteros inteligentes y la biblioteca estándar de C++.
Nombre de análisis de código: WIN32UNRELEASEDVADS
Ejemplo
El código de ejemplo siguiente genera la advertencia C6250:
#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, use el código de ejemplo siguiente:
#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...
}
}