Поделиться через


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...
  }
}