C6250
avviso C6250: La chiamata di <funzione> VirtualFree senza il flag MEM_RELEASE potrebbe liberare la memoria ma non i descrittori di indirizzo (VAD), con conseguente perdita di spazio
L'avviso indica che una chiamata a VirtualFree senza il flag MEM_RELEASE libera solo le pagine, senza rilasciarle. Per liberare e rilasciare le pagine, utilizzare il flag MEM_RELEASE nella chiamata a VirtualFree. Se nell'area sono presenti pagine modificate, la funzione dapprima le libera, quindi le rilascia. Dopo questa operazione le pagine sono in stato libero. Se si specifica tale flag, dwSize deve essere zero, mentre lpAddress deve fare riferimento all'indirizzo base restituito dalla funzione VirtualAlloc quando l'area era riservata. Se una di queste condizioni non si verifica, la funzione ha esito negativo.
L'avviso può essere ignorato se il codice in seguito libererà lo spazio degli indirizzi chiamando VirtualFree con il flag MEM_RELEASE.
Per ulteriori informazioni, vedere VirtualAlloc e VirtualFree (le pagine potrebbero essere in inglese).
Esempio
L'esempio di codice seguente genera questo avviso:
#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");
}
}
Per risolvere il problema, utilizzare il codice di esempio seguente:
#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...
}
}