다음을 통해 공유


VirtualFree 함수(memoryapi.h)

호출 프로세스의 가상 주소 공간 내에서 페이지 영역을 해제, 커밋 해제 또는 해제합니다.

VirtualAllocEx 함수에서 다른 프로세스에 할당된 메모리를 해제하려면 VirtualFreeEx 함수를 사용합니다.

구문

BOOL VirtualFree(
  [in] LPVOID lpAddress,
  [in] SIZE_T dwSize,
  [in] DWORD  dwFreeType
);

매개 변수

[in] lpAddress

해제할 페이지 영역의 기본 주소에 대한 포인터입니다.

dwFreeType 매개 변수가 MEM_RELEASE 경우 이 매개 변수는 페이지 영역이 예약된 경우 VirtualAlloc 함수에서 반환하는 기본 주소여야 합니다.

[in] dwSize

해제할 메모리 영역의 크기(바이트)입니다.

dwFreeType 매개 변수가 MEM_RELEASE 경우 이 매개 변수는 0이어야 합니다. 함수는 VirtualAlloc에 대한 초기 할당 호출에서 예약된 전체 지역을 해제합니다.

dwFreeType 매개 변수가 MEM_DECOMMIT 경우 함수는 lpAddress 매개 변수(lpAddress+dwSize)에서 로 범위에서 하나 이상의 바이트를 포함하는 모든 메모리 페이지를 커밋 해제합니다. 예를 들어 페이지 경계에 걸쳐 있는 2 바이트 메모리 영역은 두 페이지를 모두 커밋 해제합니다. lpAddressVirtualAlloc에서 반환된 기본 주소이고 dwSize가 0인 경우 함수는 VirtualAlloc에 의해 할당된 전체 지역을 커밋 해제합니다. 그 후 전체 지역이 예약된 상태입니다.

[in] dwFreeType

무료 작업의 유형입니다. 이 매개 변수는 다음 값 중 하나여야 합니다.

의미
MEM_DECOMMIT
0x00004000
커밋된 페이지의 지정된 영역을 커밋 해제합니다. 작업 후 페이지는 예약된 상태입니다.

커밋되지 않은 페이지를 커밋 해제하려고 하면 함수가 실패하지 않습니다. 즉, 현재 약정 상태를 먼저 결정하지 않고도 다양한 페이지를 커밋 해제할 수 있습니다.

lpAddress 매개 변수가 enclave의 기본 주소를 제공하는 경우 MEM_DECOMMIT 값은 지원되지 않습니다. 동적 메모리 관리(예: SGX1)를 지원하지 않는 Enclave의 경우 마찬가지입니다. SGX2 enclave는 enclave의 모든 위치에서 MEM_DECOMMIT 허용합니다.

MEM_RELEASE
0x00008000
지정한 페이지 영역 또는 자리 표시자를 해제합니다(자리 표시자의 경우 주소 공간이 해제되어 다른 할당에 사용할 수 있음). 이 작업 후에는 페이지가 사용이 해제된 상태입니다.

이 값을 지정하는 경우 dwSize 는 0이어야 하며 lpAddress 는 지역이 예약된 경우 VirtualAlloc 함수에서 반환하는 기본 주소를 가리킵니다. 이러한 조건 중 하나가 충족되지 않으면 함수가 실패합니다.

지역의 모든 페이지가 현재 커밋된 경우 함수는 먼저 커밋을 해제한 다음 해제합니다.

다른 상태, 예약된 페이지 및 커밋된 일부 페이지를 해제하려고 하면 함수가 실패하지 않습니다. 즉, 현재 약정 상태를 먼저 결정하지 않고도 페이지 범위를 해제할 수 있습니다.

MEM_RELEASE 사용하는 경우 이 매개 변수는 다음 값 중 하나를 추가로 지정할 수 있습니다.

의미
MEM_COALESCE_PLACEHOLDERS
0x00000001
인접한 자리 표시자 두 개를 병합하려면 를 지정 MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS합니다. 자리 표시자를 병합할 때 lpAddressdwSize 는 병합할 자리 표시자의 전체 범위와 정확히 일치해야 합니다.
MEM_PRESERVE_PLACEHOLDER
0x00000002
자리 표시자로 할당을 다시 해제합니다(VirtualAlloc2 또는 Virtual2AllocFromApp을 사용하여 자리 표시자를 프라이빗 할당으로 바꾼 후).

자리 표시자를 두 자리 표시자로 분할하려면 를 지정 MEM_RELEASE | MEM_PRESERVE_PLACEHOLDER합니다.

반환 값

함수가 성공하면 반환 값이 0이 아닙니다.

함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

설명

프로세스 가상 주소 공간의 각 메모리 페이지에는 페이지 상태가 있습니다. VirtualFree 함수는 서로 다른 상태, 커밋된 페이지 및 커밋되지 않은 일부 페이지에 대한 커밋을 해제할 수 있습니다. 즉, 각 페이지의 현재 약정 상태를 먼저 결정하지 않고도 다양한 페이지를 커밋 해제할 수 있습니다. 페이지를 커밋 해제하면 메모리 또는 디스크의 페이징 파일에서 실제 스토리지가 해제됩니다.

페이지가 커밋 해제되었지만 해제되지 않은 경우 해당 상태가 예약됨으로 변경됩니다. 그런 다음 VirtualAlloc 을 호출하여 커밋하거나 VirtualFree 를 호출하여 해제할 수 있습니다. 예약된 페이지에서 읽거나 쓰려고 시도하면 액세스 위반 예외가 발생합니다.

VirtualFree 함수는 서로 다른 상태의 일부 예약된 페이지와 커밋된 일부 페이지를 해제할 수 있습니다. 즉, 각 페이지의 현재 약정 상태를 먼저 결정하지 않고도 페이지 범위를 해제할 수 있습니다. 원래 VirtualAlloc 함수에서 예약한 전체 페이지 범위를 동시에 해제해야 합니다.

페이지가 릴리스되면 해당 상태가 무료로 변경되고 후속 할당 작업에 사용할 수 있습니다. 메모리가 해제되거나 커밋 해제된 후에는 메모리를 다시 참조할 수 없습니다. 해당 메모리에 있었을 수 있는 모든 정보는 영원히 사라집니다. 무료 페이지에서 읽거나 쓰기를 시도하면 액세스 위반 예외가 발생합니다. 정보를 유지해야 하는 경우 정보가 포함된 메모리를 커밋 해제하거나 해제하지 마세요.

VirtualFree 함수는 메모리의 AWE 영역에서 사용할 수 있으며 주소 공간을 확보할 때 해당 지역의 실제 페이지 매핑을 무효화합니다. 그러나 실제 페이지는 삭제되지 않으며 애플리케이션에서 사용할 수 있습니다. 애플리케이션은 물리적 페이지를 해제하려면 FreeUserPhysicalPages 를 명시적으로 호출해야 합니다. 프로세스가 종료되면 모든 리소스가 자동으로 정리됩니다.

Windows 10 버전 1709 이상 및 Windows 11: 사용을 완료할 때 enclave를 삭제하려면 DeleteEnclave를 호출합니다. VirtualFree 또는 VirtualFreeEx 함수를 호출하여 VBS enclave 를 삭제할 수 없습니다. VirtualFree 또는 VirtualFreeEx를 호출하여 SGX enclave를 삭제할 수 있습니다.

Windows 10 버전 1507, Windows 10, 버전 1511, Windows 10, 버전 1607 및 Windows 10 버전 1703: 사용을 완료할 때 enclave를 삭제하려면 VirtualFree 또는 VirtualFreeEx 함수를 호출하고 다음 값을 지정합니다.

  • lpAddress 매개 변수에 대한 enclave의 기본 주소입니다.
  • dwSize 매개 변수의 경우 0입니다.
  • dwFreeType 매개 변수에 대한 MEM_RELEASE.

예제

예제는 메모리 예약 및 커밋을 참조하세요.

요구 사항

   
지원되는 최소 클라이언트 Windows XP [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 memoryapi.h(Windows.h, Memoryapi.h 포함)
라이브러리 onecore.lib
DLL Kernel32.dll

참고 항목

메모리 관리 함수

가상 메모리 함수

VirtualFreeEx

VBS Enclave에서 사용할 수 있는 Vertdll API