Лаб. работа “Работа с динамической памятью в Windows”
Системное программирование
Практика
Цель лабораторной работы
Создание приложения с использованием WinAPI, демонстрирующего управление динамической памятью различными способами, а также реализация пользовательской кучи для динамического распределения памяти.
Задачи лабораторной работы
- Ознакомиться с документацией по функциям HeapAlloc, HeapFree, VirtualAlloc, VirtualFree.
- Создать программы, которые выделяют и освобождаеют блоки памяти с использованием различных функций управления динамической памятью.
- Провести отладку написанных программ с использованием инструментов Visual Studio.
- Проанализировать различия между использованием кучи и виртуальной памяти.
- Оформить отчет о выполненной работе, включающий описание поставленных задач, исходный код программ, результаты тестирования и анализ эффективности различных методов работы с памятью.
Порядок выполнения работы
- Изучить теорию по теме Управление памятью в Windows
- Работа с динамической памятью на языке C или C++:
- Выполнить задание №1 согласно варианту с использованием различных способов выделения и освобождения динамической памяти:
- Использование
malloc
,realloc
,free
- Использование
new
,delete
(только на C++) - Использование
VirtualAlloc
,VirtualFree
- Использование
HeapAlloc
,HeapFree
- Использование
- Выполнить задание №2 согласно варианту с использованием пользовательской кучи (функции
HeapCreate
,HeapAlloc
,HeapReAlloc
,HeapFree
,HeapDestroy
)
- Выполнить задание №1 согласно варианту с использованием различных способов выделения и освобождения динамической памяти:
Варианты заданий
Задание №1
- Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и сумму чисел в массиве. Прибавить сумму чисел к каждому элементу массива, вывести массив на экран. Освободить память.
- Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и среднее значение чисел в массиве. Прибавить среднее значение к каждому элементу массива, вывести массив на экран. Освободить память.
- Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и максимальное число в массиве. Прибавить максимальное значение к каждому элементу массива, вывести массив на экран. Освободить память.
- Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и минимальное число в массиве. Прибавить минимальное значение к каждому элементу массива, вывести массив на экран. Освободить память.
- Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и количество четных чисел в массиве. Прибавить это количество к каждому элементу массива, вывести массив на экран. Освободить память.
- Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и количество нечетных чисел в массиве. Прибавить это количество к каждому элементу массива, вывести массив на экран. Освободить память.
- Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран исходное содержимое массива и отсортированное по возрастанию содержимое. Освободить память.
- Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран исходное содержимое массива и отсортированное по убыванию содержимое. Освободить память.
- Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран исходное содержимое массива, переставить числа в массиве в обратном порядке и вывести на экран. Освободить память.
- Создать динамический массив. Размер вводится пользователем. Заполнить массив элементами ряда Фибоначчи. Вывести на экран исходное содержимое массива, переставить числа в массиве в обратном порядке и вывести на экран. Освободить память.
Задание №2
Создать пользовательскую кучу. Создать динамический массив из указателей. Размер вводится пользователем. Для каждого элемента массива выделить память по отдельности из пользовательской кучи. Указатели на созданные элементы сохранить в массиве. Выполнить задание с этим массивом согласно варианта задания № 1. В конце освободить память, уничтожив пользовательскую кучу.
Контрольные вопросы
- Основные концепции:
- Что такое динамическая память и как она отличается от статической памяти?
- Какие проблемы могут возникнуть при неправильном использовании динамической памяти?
- Функции управления памятью:
- Какие функции Windows API используются для работы с динамической памятью?
- В чем различие между функциями
HeapAlloc
иVirtualAlloc
? - Как освободить память, выделенную функцией
HeapAlloc
? А функциейVirtualAlloc
?
- Кучи (Heap):
- Что такое куча (heap) и как она используется для управления памятью?
- Как создать и уничтожить кучу с помощью Windows API?
- Какие параметры можно задать при создании кучи?
- Виртуальная память:
- Что такое виртуальная память и как она управляется в Windows?
- Какие преимущества и недостатки есть у использования виртуальной памяти по сравнению с кучей?
- Отладка и диагностика:
- Каковы основные инструменты и методы отладки утечек памяти в Visual Studio?
- Как обнаружить и исправить утечки памяти в программах?
- Оптимизация и эффективность:
- Какие методы можно использовать для минимизации фрагментации памяти?
- Каковы основные принципы написания эффективного кода, работающего с динамической памятью?
- Практическое применение:
- Опишите процесс выделения и освобождения памяти с использованием функции
HeapAlloc
. - Приведите пример кода, использующего функции
VirtualAlloc
иVirtualFree
. - Какие меры предосторожности необходимо соблюдать при работе с динамической памятью?
- Опишите процесс выделения и освобождения памяти с использованием функции
- Анализ и сравнение:
- В каких случаях предпочтительно использовать кучу, а в каких — виртуальную память?
- Какое влияние на производительность оказывает использование кучи и виртуальной памяти?