다음을 통해 공유


HeapValidate 함수(heapapi.h)

지정된 힙의 유효성을 검사합니다. 함수는 힙의 모든 메모리 블록을 검사하고 힙 관리자가 유지 관리하는 힙 제어 구조가 일관된 상태임을 확인합니다. HeapValidate 함수를 사용하여 전체 힙의 유효성을 검사하지 않고 지정된 힙 내에서 단일 메모리 블록의 유효성을 검사할 수도 있습니다.

구문

BOOL HeapValidate(
  [in]           HANDLE  hHeap,
  [in]           DWORD   dwFlags,
  [in, optional] LPCVOID lpMem
);

매개 변수

[in] hHeap

유효성을 검사할 힙에 대한 핸들입니다. 이 핸들은 HeapCreate 또는 GetProcessHeap 함수에서 반환됩니다.

[in] dwFlags

힙 액세스 옵션입니다. 이 매개 변수는 다음 값일 수 있습니다.

의미
HEAP_NO_SERIALIZE
0x00000001
직렬화된 액세스는 사용되지 않습니다. 자세한 내용은 설명 부분을 참조하세요.

이 함수에 대한 모든 호출에 대해 직렬화된 액세스를 사용하지 않도록 설정하려면 HeapCreate 호출에서 HEAP_NO_SERIALIZE 지정합니다. 이 경우 이 함수 호출에서 HEAP_NO_SERIALIZE 추가로 지정할 필요는 없습니다.

프로세스 기본 힙에 액세스할 때 이 값을 지정하면 안 됩니다. 시스템은 프로세스 기본 힙에 동시에 액세스하는 Ctrl+C 처리기와 같은 애플리케이션 프로세스 내에 추가 스레드를 만들 수 있습니다.

[in, optional] lpMem

지정된 힙 내의 메모리 블록에 대한 포인터입니다. 이 매개 변수는 NULL일 수 있습니다.

이 매개 변수가 NULL인 경우 함수는 hHeap으로 지정된 전체 힙의 유효성을 검사하려고 시도합니다.

이 매개 변수가 NULL이 아닌 경우 함수는 lpMem이 가리키는 메모리 블록의 유효성을 검사하려고 시도합니다. 나머지 힙의 유효성을 검사하지 않습니다.

반환 값

지정된 힙 또는 메모리 블록이 유효한 경우 반환 값은 0이 아닌 값입니다.

지정된 힙 또는 메모리 블록이 잘못된 경우 반환 값은 0입니다. 디버깅을 위해 설정된 시스템에서 HeapValidate 함수는 잘못된 힙 또는 메모리 블록의 일부를 설명하는 디버깅 메시지를 표시하고, 시스템을 검사하여 무효의 원인을 확인할 수 있도록 하드 코딩된 중단점에서 중지합니다. HeapValidate 함수는 스레드의 마지막 오류 값을 설정하지 않습니다. 이 함수에 대한 확장 오류 정보는 없습니다. GetLastError를 호출하지 마세요.

설명

HeapValidate 함수는 유효성 검사가 잠재적으로 시간이 오래 걸리기 때문에 디버깅에 주로 유용합니다. 힙의 유효성을 검사하면 다른 스레드가 힙에 액세스하지 못하도록 차단할 수 있으며, 특히 SMP(대칭 다중 처리) 컴퓨터에서 성능이 저하할 수 있습니다. 이러한 부작용은 HeapValidate 가 반환될 때까지 지속될 수 있습니다.

힙의 각 메모리 블록과 힙 전체에 대한 힙 제어 구조가 있습니다. HeapValidate 함수를 사용하여 전체 힙의 유효성을 검사하는 경우 이러한 모든 컨트롤 구조에서 일관성을 검사합니다.

HeapValidate를 사용하여 힙 내의 단일 메모리 블록의 유효성을 검사하는 경우 해당 요소와 관련된 컨트롤 구조만 확인합니다. HeapValidate 는 할당된 메모리 블록의 유효성만 검사할 수 있습니다. 해제된 메모리 블록에서 HeapValidate 를 호출하면 유효성을 검사할 제어 구조가 없으므로 FALSE 가 반환됩니다.

HeapWalk 함수로 열거된 힙 요소의 유효성을 검사하려면 PROCESS_HEAP_ENTRY 구조체wFlags 멤버에 PROCESS_HEAP_ENTRY_BUSY 요소에서만 HeapValidate를 호출해야 합니다. HeapValidate 는 이 비트가 설정되지 않은 모든 힙 요소에 대해 FALSE 를 반환합니다.

직렬화는 둘 이상의 스레드가 동일한 힙에서 블록을 동시에 할당하거나 해제하려고 할 때 상호 제외를 보장합니다. serialization에는 약간의 성능 비용이 있지만 여러 스레드가 동일한 힙에서 메모리를 할당하고 해제할 때마다 사용해야 합니다. HEAP_NO_SERIALIZE 값을 설정하면 힙에서 상호 제외가 제거됩니다. 직렬화가 없으면 동일한 힙 핸들을 사용하는 두 개 이상의 스레드가 동시에 메모리를 할당하거나 해제하려고 시도할 수 있으며, 이로 인해 힙이 손상될 수 있습니다. 따라서 HEAP_NO_SERIALIZE 값은 다음과 같은 경우에만 안전하게 사용할 수 있습니다.

  • 프로세스에는 스레드가 하나만 있습니다.
  • 프로세스에는 여러 스레드가 있지만 한 스레드만 특정 힙에 대한 힙 함수를 호출합니다.
  • 프로세스에는 여러 스레드가 있으며 애플리케이션은 특정 힙에 대한 상호 배제를 위한 고유한 메커니즘을 제공합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 heapapi.h(Windows.h 포함)
라이브러리 Kernel32.lib
DLL Kernel32.dll

참고 항목

힙 함수

HeapCreate

HeapWalk

메모리 관리 함수

PROCESS_HEAP_ENTRY