GlobalAlloc 함수(winbase.h)
힙에서 지정된 바이트 수를 할당합니다.
구문
DECLSPEC_ALLOCATOR HGLOBAL GlobalAlloc(
[in] UINT uFlags,
[in] SIZE_T dwBytes
);
매개 변수
[in] uFlags
메모리 할당 특성입니다. 0을 지정하면 기본값은 GMEM_FIXED. 이 매개 변수는 특별히 언급된 호환되지 않는 조합을 제외하고 다음 값 중 하나 이상일 수 있습니다.
값 | 의미 |
---|---|
|
GMEM_MOVEABLE 및 GMEM_ZEROINIT 결합합니다. |
|
고정 메모리를 할당합니다. 반환 값은 포인터입니다. |
|
이동 가능한 메모리를 할당합니다. 메모리 블록은 실제 메모리에서 이동되지 않지만 기본 힙 내에서 이동할 수 있습니다.
반환 값은 메모리 개체에 대한 핸들입니다. 핸들을 포인터로 변환하려면 GlobalLock 함수를 사용합니다. 이 값은 GMEM_FIXED 결합할 수 없습니다. |
|
메모리 콘텐츠를 0으로 초기화합니다. |
|
GMEM_FIXED 및 GMEM_ZEROINIT 결합합니다. |
다음 값은 사용되지 않지만 16비트 Windows와의 호환성을 위해 제공됩니다. 무시됩니다.
- GMEM_DDESHARE
- GMEM_DISCARDABLE
- GMEM_LOWER
- GMEM_NOCOMPACT
- GMEM_NODISCARD
- GMEM_NOT_BANKED
- GMEM_NOTIFY
- GMEM_SHARE
[in] dwBytes
할당할 바이트 수입니다. 이 매개 변수가 0이고 uFlags 매개 변수가 GMEM_MOVEABLE 지정하는 경우 함수는 삭제된 것으로 표시된 메모리 개체에 대한 핸들을 반환합니다.
반환 값
함수가 성공하면 반환 값은 새로 할당된 메모리 개체에 대한 핸들입니다.
함수가 실패하면 반환 값은 NULL입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.
설명
Windows 메모리 관리는 별도의 로컬 힙 및 전역 힙을 제공하지 않습니다. 따라서 GlobalAlloc 및 LocalAlloc 함수는 기본적으로 동일합니다.
movable-memory flags GHND 및 GMEM_MOVABLE 불필요한 오버헤드를 추가하고 잠금을 안전하게 사용해야 합니다. 설명서에서 사용해야 한다고 구체적으로 명시하지 않는 한 피해야 합니다.
설명서에서 전역 함수를 사용해야 한다고 구체적으로 명시하지 않는 한 새 애플리케이션은 힙 함수를 사용하여 메모리를 할당하고 관리해야 합니다. 예를 들어 전역 함수는 여전히 DDE(동적 데이터 교환), 클립보드 함수 및 OLE 데이터 개체와 함께 사용됩니다.
GlobalAlloc 함수가 성공하면 요청된 메모리 양 이상을 할당합니다. 할당된 실제 금액이 요청된 금액보다 크면 프로세스에서 전체 금액을 사용할 수 있습니다. 할당된 실제 바이트 수를 확인하려면 GlobalSize 함수를 사용합니다.
힙에 요청을 충족할 수 있는 충분한 여유 공간이 없으면 GlobalAlloc 은 NULL을 반환합니다. NULL은 오류를 나타내는 데 사용되므로 가상 주소 0은 할당되지 않습니다. 따라서 NULL 포인터의 사용을 쉽게 감지할 수 있습니다.
이 함수와 함께 할당된 메모리는 8 바이트 경계에 맞춰지도록 보장됩니다. 동적으로 생성된 코드를 실행하려면 VirtualAlloc 함수를 사용하여 메모리를 할당하고 VirtualProtect 함수를 사용하여 PAGE_EXECUTE 액세스 권한을 부여합니다.
메모리를 해제하려면 GlobalFree 함수를 사용합니다. LocalFree를 사용하여 GlobalAlloc에 할당된 메모리를 해제하는 것은 안전하지 않습니다.
예제
다음 코드에서는 GlobalAlloc 및 GlobalFree를 간단하게 사용하는 방법을 보여줍니다.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _cdecl main()
{
PSECURITY_DESCRIPTOR pSD;
pSD = (PSECURITY_DESCRIPTOR) GlobalAlloc(
GMEM_FIXED,
sizeof(PSECURITY_DESCRIPTOR));
// Handle error condition
if( pSD == NULL )
{
_tprintf(TEXT("GlobalAlloc failed (%d)\n"), GetLastError());
return;
}
//see how much memory was allocated
_tprintf(TEXT("GlobalAlloc allocated %d bytes\n"), GlobalSize(pSD));
// Use the memory allocated
// Free the memory when finished with it
GlobalFree(pSD);
}
요구 사항
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | winbase.h(Windows.h 포함) |
라이브러리 | Kernel32.lib |
DLL | Kernel32.dll |