GlobalAlloc 関数 (winbase.h)
ヒープから指定したバイト数を割り当てます。
構文
DECLSPEC_ALLOCATOR HGLOBAL GlobalAlloc(
[in] UINT uFlags,
[in] SIZE_T dwBytes
);
パラメーター
[in] uFlags
メモリ割り当て属性。 0 を指定した場合、既定値は GMEM_FIXED。 このパラメーターには、特に記載されている互換性のない組み合わせを除き、次の値のうち 1 つ以上を指定できます。
値 | 説明 |
---|---|
|
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 関数は基本的に同じです。
移動可能メモリ フラグ 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 を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |