GlobalAlloc 関数 (winbase.h)

ヒープから指定したバイト数を割り当てます。

メモ グローバル関数はオーバーヘッドが大きく、他のメモリ管理機能よりも機能が少なくなります。 新しいアプリケーションでは、グローバル 関数 を使用する必要があるとドキュメントに記載されていない限り、ヒープ関数を使用する必要があります。 詳細については、「 グローバル関数とローカル関数」を参照してください。
 

構文

DECLSPEC_ALLOCATOR HGLOBAL GlobalAlloc(
  [in] UINT   uFlags,
  [in] SIZE_T dwBytes
);

パラメーター

[in] uFlags

メモリ割り当て属性。 0 を指定した場合、既定値は GMEM_FIXED。 このパラメーターには、特に記載されている互換性のない組み合わせを除き、次の値のうち 1 つ以上を指定できます。

説明
GHND
0x0042
GMEM_MOVEABLEGMEM_ZEROINITを結合します。
GMEM_FIXED
0x0000
固定メモリを割り当てます。 戻り値はポインターです。
GMEM_MOVEABLE
0x0002
移動可能なメモリを割り当てます。 メモリ ブロックは物理メモリ内では移動されませんが、既定のヒープ内で移動できます。

戻り値は、メモリ オブジェクトへのハンドルです。 ハンドルをポインターに変換するには、 GlobalLock 関数を使用します。

この値を GMEM_FIXEDと組み合わせることはできません。

GMEM_ZEROINIT
0x0040
メモリの内容を 0 に初期化します。
GPTR
0x0040
GMEM_FIXEDGMEM_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 関数は基本的に同じです。

移動可能メモリ フラグ GHNDGMEM_MOVABLE は不要なオーバーヘッドを追加し、ロックを安全に使用する必要があります。 特にドキュメントで使用する必要があると記載されていない限り、避ける必要があります。

新しいアプリケーションでは、 ヒープ関数 を使用してメモリの割り当てと管理を行う必要があります。ただし、グローバル関数を使用する必要があるとドキュメントに明記されている場合を除きます。 たとえば、グローバル関数は、動的データ交換 (DDE)、クリップボード関数、OLE データ オブジェクトと共に引き続き使用されます。

GlobalAlloc 関数が成功すると、要求されたメモリの量が少なくとも割り当てられます。 割り当てられた実際の金額が要求された金額より大きい場合、プロセスは金額全体を使用できます。 割り当てられた実際のバイト数を確認するには、 GlobalSize 関数を使用します。

要求を満たすのに十分な空き領域がヒープに含まれていない場合、 GlobalAllocNULL を返します。 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

関連項目

グローバル関数とローカル関数

GlobalDiscard

GlobalFree

GlobalLock

GlobalSize

ヒープ関数

メモリ管理関数