다음을 통해 공유


경고 C6331

잘못된 매개 변수: MEM_RELEASE 및 MEM_DECOMMIT 함께 *function* 전달할 수 없습니다. 이로 인해 이 호출이 실패합니다.

이 메시지는 잘못된 매개 변수가 전달되거나 VirtualFreeVirtualFreeEx. VirtualFreeVirtualFreeEx 다 함께 플래그(MEM_RELEASE | MEM_DECOMMIT)를 거부합니다. 따라서 값을 MEM_DECOMMITMEM_RELEASE 동일한 호출에서 함께 사용할 수 없습니다.

설명

커밋 해제 및 릴리스가 독립적인 단계로 수행될 필요는 없습니다. 커밋된 메모리를 해제하면 페이지도 커밋되지 않습니다. 또한 이 함수의 반환 값이 무시되지 않는지 확인합니다.

코드 분석 이름: VirtualFreeInvalidParam1

예시

다음 샘플 코드는 경고 C6331을 생성합니다.

#include <windows.h>
#define PAGELIMIT 80

DWORD dwPages = 0;  // count of pages
DWORD dwPageSize;   // page size

VOID fd( VOID )
{
  LPVOID lpvBase;            // base address of the test memory
  BOOL bSuccess;
  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 );
  if (lpvBase)
  {
    // code to access memory
  }
  else
  {
    return;
  }
  bSuccess = VirtualFree(lpvBase,
                0,
                MEM_DECOMMIT | MEM_RELEASE); // warning
  // code...
}

이 경고를 수정하려면 다음 코드와 같이 호출에 전달 MEM_DECOMMITVirtualFree 하지 마세요.

#include <windows.h>
#define PAGELIMIT 80

DWORD dwPages = 0;  // count of pages
DWORD dwPageSize;   // page size

VOID f( VOID )
{
  LPVOID lpvBase;            // base address of the test memory
  BOOL bSuccess;
  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 );
  if (lpvBase)
  {
    // code to access memory
  }
  else
  {
    return;
  }
  bSuccess = VirtualFree(lpvBase, 0, MEM_RELEASE);
  // code...
}

사용 mallocfree (및 관련 동적 메모리 할당 API)에는 메모리 누수 및 예외 측면에서 많은 단점이 있습니다. 이러한 종류의 잠재적 누출을 완전히 방지하려면 C++ STL(표준 라이브러리)에서 제공하는 메커니즘을 사용합니다. 여기에는 < a0/> unique_ptr및 컨테이너(예: vector.)가 포함shared_ptr됩니다. 자세한 내용은 스마트 포인터 및C++ 표준 라이브러리를 참조하세요.

참고 항목

VirtualAlloc 메서드
VirtualFree 메서드