Операционная система Microsoft Windows 3.1 для программиста© Александр Фролов, Григорий ФроловТом 13, М.: Диалог-МИФИ, 1993, 284 стр. 2.4. Функция malloc и farmallocДля получения блока памяти приложения Windows могут использовать функцию malloc. void *malloc(size_t size); Выделенный блок памяти будет автоматически зафиксирован. С помощью этой функции вы, однако, не сможете получить блок памяти размером большим, чем 64 Кбайт, так как тип size_t отображается на 16-разрядное целое. Блоки памяти, полученные с помощью функции malloc, необходимо освобождать функцией free , указывая ей адрес освобождаемого блока памяти: void free(void *block); Если вам надо получить большой блок памяти, можно воспользоваться функцией farmalloc , которая входит в состав стандартной библиотеки Borland C++: void far *farmalloc(unsigned long nbytes); Так как параметр этой функции, определяющий размер заказываемого блока памяти, имеет тип unsigned long, вы можете запрашивать блоки памяти очень большого размера. Возвращаемое этой функцией значение следует преобразовывать в указатель типа huge. В этом случае с использованием такого указателя вы сможете напрямую адресовать любой участок большого блока памяти. Освобождение блока памяти, полученного при помощи функции farmalloc, должно выполняться функцией farfree : void farfree(void far *block); В некоторых случаях использование функции farmalloc может оказаться предпочтительней, чем использование функции GlobalAlloc. Как вы знаете, локальная таблица дескрипторов может содержать не более чем 8192 дескриптора. Значительная часть локальной таблицы дескрипторов, которая в Windows версии 3.1 одна на все приложения, может быть занята самой операционной системой или другими приложениями. Если ваше приложение заказывает большое количество глобальных блоков памяти, используя функцию GlobalAlloc, таблица дескрипторов может быстро переполниться, так как для каждого блока памяти в локальной дескрипторной таблице создается отдельный дескриптор. Для функции farmalloc используется другой метод. В локальной таблице дескрипторов создается один дескриптор, который адресует область памяти, используемую одновременно для выделения нескольких блоков памяти. Например, если вы заказали блок памяти размером 100 Кбайт, а затем из них освободили 50 Кбайт, при повторном запросе памяти она будет выделена из заказанного ранее блока без создания нового дескриптора. Таким образом, функция farmalloc позволяет экономить свободное пространство в локальной таблице дескрипторов. |