Avviso C6250
La chiamata a "VirtualFree" senza il flag MEM_RELEASE può liberare memoria ma non descrittori di indirizzi (VAD); genera perdite di spazio indirizzi
Questo avviso indica che una chiamata a VirtualFree
senza il MEM_RELEASE
flag decommette solo le pagine e non le rilascia. Per eseguire il decommit e le pagine di rilascio, usare il MEM_RELEASE
flag nella chiamata a VirtualFree
. Se viene eseguito il commit di pagine nell'area, la funzione viene prima decomplicata e quindi le rilascia. Dopo questa operazione, le pagine si trovano nello stato libero. Se si specifica questo flag, dwSize
deve essere zero e lpAddress
deve puntare all'indirizzo di base restituito dalla VirtualAlloc
funzione quando l'area è stata riservata. La funzione ha esito negativo se una di queste condizioni non viene soddisfatta.
È possibile ignorare questo avviso se il codice libera in un secondo momento lo spazio degli indirizzi chiamando VirtualFree
con il MEM_RELEASE
flag .
Per altre informazioni, vedere VirtualAlloc
e VirtualFree
.
L'uso di VirtualAlloc
e VirtualFree
presenta molte insidie in termini di perdite di memoria ed eccezioni. Per evitare completamente questi tipi di potenziali perdite, usare i meccanismi forniti dalla libreria standard C++ (STL). Sono inclusi shared_ptr
i contenitori , e , unique_ptr
ad esempio vector
. Per altre informazioni, vedere Puntatori intelligenti e libreria standard C++.
Nome dell'analisi del codice: WIN32UNRELEASEDVADS
Il codice di esempio seguente genera l'avviso 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");
}
}
Per correggere questo avviso, usare 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...
}
}