C6250
Обновлен: Ноябрь 2007
C6250
Предупреждение C6250: вызов <функции> VirtualFree без флага MEM_RELEASE может привести к высвобождению памяти, но не дескрипторов адресов (VAD); в результате будет утечка адресного пространства.
Это предупреждение указывает, что вызов VirtualFree без флага MEM_RELEASE отменяется фиксация страниц, но они не высвобождаются. Чтобы отменить фиксацию страниц и высвободить их, используйте флаг MEM_RELEASE в вызове VirtualFree. Если какие-либо страницы в области зафиксированы, функция сначала отменяет их фиксацию, а затем высвобождает. После этой операции страницы будут находиться в свободном состоянии. Если указать этот флаг, параметр dwSize должен быть равен нулю, а lpAddress должен указывать на базовый адрес, возвращенный функцией VirtualAlloc при резервировании области. Функция не работает, если не выполнено хотя бы одно из этих условий.
Можно пропустить этот предупреждение, если в последующих сегментах кода адресное пространство высвобождается путем вызова VirtualFree с флагом MEM_RELEASE.
Пример
Это предупреждение создается в следующем примере кода:
#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");
}
}
Чтобы исправить это предупреждение, используйте следующий код:
#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...
}
}