Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
29.36 Кб
Скачать

49) Распределение и освобождение памяти из кучи

Для распределения памяти из кучи используется функция неарАНос, которая имеет следующий прототип:

LPVOID HeapAlloc(

HANDLE hHeap, // дескриптор кучи

DWORD dwFlags, // управляющие флаги

SIZE_T dwBytes // размер распределяемой памяти) ;

В случае успешного завершения эта функция возвращает адрес распределенной памяти, а в случае неудачи возможны два варианта работы функции. Если флаг HEAP_GENERATE_EXCEPTIONS Не установлен, ТО функция HeapAlloc в случае неудачи возвращает значение null. Если же этот флаг установлен, то в случае неудачи эта функция генерирует одно из следующих исключений:

sтatus_no_memory — не хватает памяти или повреждение кучи;

s т atu s_ac с es s_v I ol at I on — повреждение кучи или неправильные параметры функции.

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

Параметр dwFlags управляет режимом работы функции и может быть установлен в любую комбинацию из следующих управляющих флагов:

нЕAP_GENERATЕ_ЕХСЕРтIONS — в случае неудачи функция сгенерирует ис-ключение;

heap_no_s er I al i z е — нет взаимного исключения при доступе к куче;

HEAP_ZERO_MEMORY — распределенная память инициализируется нулями.

Параметр dwBytes задает в байтах размер памяти, которая будет распределена из кучи.

Распределение и освобождение памяти из кучи процесса

# include <windows.h>

#include <iostream.h>

int main(){

HANDLE hHeap;

int *a = NULL;

int size = 1000;

hHeap = GetProcessHeap(); if (!hHeap){

cout « «Heap create failed.» « endl; return GetLastError();}

а = (int*)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, size * sizeof(int));

cout « «а[10] = « « а[10] « endl;

if (IHeapFrее(hHeap, NULL, а)){

cout « «Heap free failed.» « endl;

return GetLastError();}

return 0;}

55) Концепция механизма отображения файлов в память

Прежде чем перейти к описанию динамически подключаемых библиотек, рассмотрим механизм, который позволяет динамически выполнять это подключение. Этот механизм называется отображением содержимого файла (file mapping) в виртуальную память процесса.В операционных системах Windows реализован механизм, который позволяет отображать в адресное пространство процесса не только содержимое файлов подкачки, но и содержимое обычных файлов. То есть в этом случае файл или его часть рассматривается как набор виртуальных страниц процесса, которые имеют последовательные логические адреса. Файл, отображенный в адресное пространство процесса, называется представлением или видом файла (file view). После отображения файла в адресное пространство процесса доступ к виду может осуществляться с помощью указателя, как к обычным данным в адресном пространстве процесса.То есть для доступа к файлу, который отображен в память, не используется функция writeFiie. Такая согласованность данных, хранящихся в файле, отображенном в память несколькими процессами, называется когерентностью данных. Однако следует отметить, что когерентность данных для файла, отображенного в память, не поддерживается в том случае, если этот файл отображается в адресное пространство процессов, которые выполняются на других компьютерах в локальной сети.

Теперь кратко опишем общую последовательность действий, которые необходимо выполнить для работы с отображаемым в память файлом. Эти действия могут быть разбиты на следующие шаги:

□ открыть файл, который будет отображаться в память;

□ создать объект ядра, который выполняет отображение файла;

□ отобразить файл или его часть в адресное пространство процесса;

□ выполнить необходимую работу с видом файла;

□ отменить отображение файла;

□ закрыть объект ядра для отображения файла;

□ закрыть файл, который отображался в память.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]