Share via


C6250

경고 C6250: MEM_RELEASE 플래그 없이 <function> VirtualFree를 호출하면 메모리는 비워지지만 주소 설명자(VAD)는 그대로 남아 주소 공간 누수가 발생합니다.

이 경고는 MEM_RELEASE 플래그 없이 VirtualFree를 호출하면 페이지 커밋을 취소하기만 하고 해제하지 않는다는 것을 나타냅니다. 페이지의 커밋을 취소하고 해제하려면 VirtualFree를 호출할 때 MEM_RELEASE 플래그를 사용합니다. 영역에 커밋된 페이지가 있으면 함수에서는 해당 페이지의 커밋을 먼저 취소한 다음 해제합니다. 이 작업이 끝나면 페이지는 비어 있는 상태가 됩니다. 이 플래그를 지정할 경우 dwSize는 0이어야 하고 lpAddress는 영역이 예약될 때 VirtualAlloc 함수가 반환한 기본 주소를 가리켜야 합니다. 이들 조건 중 하나라도 일치하지 않으면 함수가 실패합니다.

코드에서 MEM_RELEASE 플래그와 함께 VirtualFree를 호출하여 나중에 주소 공간을 해제하는 경우에는 이 경고를 무시해도 됩니다.

자세한 내용은 VirtualAllocVirtualFree를 참조하십시오.

예제

다음 샘플 코드에서는 이 경고를 발생시킵니다.

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