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 바이트 메모리 영역은 두 페이지를 모두 커밋 해제합니다. lpAddress가 VirtualAlloc에서 반환된 기본 주소이고 dwSize가 0인 경우 함수는 VirtualAlloc에 의해 할당된 전체 지역을 커밋 해제합니다. 그 후 전체 지역이 예약된 상태입니다.
[in] dwFreeType
무료 작업의 유형입니다. 이 매개 변수는 다음 값 중 하나여야 합니다.
값 | 의미 |
---|---|
|
커밋된 페이지의 지정된 영역을 커밋 해제합니다. 작업 후 페이지는 예약된 상태입니다.
커밋되지 않은 페이지를 커밋 해제하려고 하면 함수가 실패하지 않습니다. 즉, 현재 약정 상태를 먼저 결정하지 않고도 다양한 페이지를 커밋 해제할 수 있습니다. lpAddress 매개 변수가 enclave의 기본 주소를 제공하는 경우 MEM_DECOMMIT 값은 지원되지 않습니다. 동적 메모리 관리(예: SGX1)를 지원하지 않는 Enclave의 경우 마찬가지입니다. SGX2 enclave는 enclave의 모든 위치에서 MEM_DECOMMIT 허용합니다. |
|
지정한 페이지 영역 또는 자리 표시자를 해제합니다(자리 표시자의 경우 주소 공간이 해제되어 다른 할당에 사용할 수 있음). 이 작업 후에는 페이지가 사용이 해제된 상태입니다.
이 값을 지정하는 경우 dwSize 는 0이어야 하며 lpAddress 는 지역이 예약된 경우 VirtualAlloc 함수에서 반환하는 기본 주소를 가리킵니다. 이러한 조건 중 하나가 충족되지 않으면 함수가 실패합니다. 지역의 모든 페이지가 현재 커밋된 경우 함수는 먼저 커밋을 해제한 다음 해제합니다. 다른 상태, 예약된 페이지 및 커밋된 일부 페이지를 해제하려고 하면 함수가 실패하지 않습니다. 즉, 현재 약정 상태를 먼저 결정하지 않고도 페이지 범위를 해제할 수 있습니다. |
MEM_RELEASE 사용하는 경우 이 매개 변수는 다음 값 중 하나를 추가로 지정할 수 있습니다.
값 | 의미 |
---|---|
|
인접한 자리 표시자 두 개를 병합하려면 를 지정 MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS 합니다. 자리 표시자를 병합할 때 lpAddress 및 dwSize 는 병합할 자리 표시자의 전체 범위와 정확히 일치해야 합니다.
|
|
자리 표시자로 할당을 다시 해제합니다(VirtualAlloc2 또는 Virtual2AllocFromApp을 사용하여 자리 표시자를 프라이빗 할당으로 바꾼 후).
자리 표시자를 두 자리 표시자로 분할하려면 를 지정 |
반환 값
함수가 성공하면 반환 값이 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 |