GlobalAlloc

Функция GlobalAlloc выделяет из кучи указанное число байт. В Win32 менеджер памяти не выполняет различия между локальной и глобальной кучей.

Примечание: глобальные и локальные функции работают медленнее, чем остальные функции менеджера памяти. Поэтому новые приложения должны использовать функции по работе с кучей. Тем не менее, глобальные функции все еще используются при работе с DDE и областью обмена.

function GlobalAlloc(
  uFlags: UINT;    // атрибуты выделения
  dwBytes: DWORD   // количество выделяемых байт
): HGLOBAL; stdcall;

Параметры

uFlags [in]
Указывает каким образом производить выделение памяти. Если в качестве параметра указан нуль, то по умолчанию используется значение GMEM_FIXED. Указанный параметр может быть комбинацией указанных ниже значений, недопустимые комбинации специально оговорены:

Флаг Назначение

GHND

Комбинация флагов GMEM_MOVEABLE и GMEM_ZEROINIT.

GMEM_FIXED

Выделяет фиксированную память. Возвращаемое значение указатель.

GMEM_MOVEABLE

Выделяет перемещаемую память. В Win32 блоки памяти никогда не могут перемещаться в физической памяти, но они могут быть перемещены внутри владеющими ними кучи.

Важно! Возвращаемое значение является дескриптором объекта в памяти. Для того, что получить указатель на память, следует воспользоваться функцией GlobalLock.

Указанное значение нельзя комбинировать с флагом GMEM_FIXED.

GMEM_ZEROINIT

Инициализирует память нулями.

GPTR

Комбинация флагов GMEM_FIXED и GMEM_ZEROINIT.

Следующие ниже значения флагов игнорируются:
Флаг Назначение

GMEM_DDESHARE

Игнорируется. Флаг оставлен только для совместимости с 16-битной Windows.

GMEM_DISCARDABLE

Игнорируется. Флаг оставлен только для совместимости с 16-битной Windows.

Тем не менее в Win32 вы можете производить вызов функции GlobalDiscard для того, чтобы разрушить объект в памяти не разрушая его дескриптор.

Указанное значение нельзя скомбинировать с GMEM_FIXED.

GMEM_LOWER

Игнорируется. Флаг оставлен только для совместимости с 16-битной Windows.

GMEM_NOCOMPACT

Игнорируется. Флаг оставлен только для совместимости с 16-битной Windows.

GMEM_NODISCARD

Игнорируется. Флаг оставлен только для совместимости с 16-битной Windows.

GMEM_NOT_BANKED

Игнорируется. Флаг оставлен только для совместимости с 16-битной Windows.

GMEM_NOTIFY

Игнорируется. Флаг оставлен только для совместимости с 16-битной Windows.

GMEM_SHARE

Игнорируется. Флаг оставлен только для совместимости с 16-битной Windows.

dwByte [in]
Указывает количесво байт, которые будут выделены. Если указанный параметр равен нулю, а параметр uFlags содержит GMEM_MOVEABLE, то функция вернет дескриптор объекта, помеченный как уничтоженный.

Возвращаемое значение

В случае успешного завершения возвращаемым значением функции является дескриптор нового объекта в памяти.

В случае ошибки возвращаемым значением будет 0. Для получения расширенной информации об ошибке следует сделать вызов GetLastError.

Описание

Если куча не содержит достаточно памяти для того, чтобы удовлетворить запросу, функция GlobalAlloc вернет 0. Это значение (0) используется в качестве индикации об ошибке, и никогда не может быть возвращено в случае, когда выделение памяти имело место. Поэтому легко определить использование нулевых указателей.

Гарантируется, что память, выделенная этой функцией, будет выровнена на границе 8-ми байт. Вся память создается с разрешением доступа на выполнение, поэтому не требуется выполнять специальный вызов для того, чтобы разрешить выполнение динамически сгенерированного кода.

При удачном завершении функции выделенный размер памяти как минимум не меньше запрашиваемого. Но если выделенный размер памяти больше запрашиваемого, то процесс может использовать остаток. Для того, чтобы определить какое именно количество памяти было выделено, следует произвести вызов функции GlobalSize.

Для того, чтобы освободить память, необходимо выполнить вызов функции GlobalFree.

Отличия Windows 95/98
Менеджер памяти для кучи спроектирован так, что размер одного блока не может превышать четыре мегабайта. Поэтому, если вы рассчитываете оперировать с блоками размером более одного или двух мегабайт, то для этой цели мы рекомендуем пользоваться функциями VirtualAlloc и VirtualAllocEx.

Требования

Windows NT/2000: Требуется Windows NT 3.1 или более поздняя версия
Windows 95/98: Требуется Windows 95 или более поздняя версия
Бибиотека: Kernel32.dll
Подключаемый модуль: Windows

Смотри также:

  • управление памятью,
  • работа с кучей,
  • функции для работы с кучей,
  • глобальные и лоальные функции,
  • GlobalDiscard,
  • GlobalFree,
  • GlobalLock,
  • GlobalSize
  • НазадGetFreeSpace GlobalCompactВперед

    © Mystic, 2002