Лаб. работа "Работа с динамической памятью в Windows"

Цель лабораторной работы

Создание приложения с использованием WinAPI, демонстрирующего управление динамической памятью различными способами, а также реализация пользовательской кучи для динамического распределения памяти.

Задачи лабораторной работы

  • Ознакомиться с документацией по функциям HeapAlloc, HeapFree, VirtualAlloc, VirtualFree.
  • Создать программы, которые выделяют и освобождаеют блоки памяти с использованием различных функций управления динамической памятью.
  • Провести отладку написанных программ с использованием инструментов Visual Studio.
  • Проанализировать различия между использованием кучи и виртуальной памяти.
  • Оформить отчет о выполненной работе, включающий описание поставленных задач, исходный код программ, результаты тестирования и анализ эффективности различных методов работы с памятью.

Порядок выполнения работы

  1. Изучить теорию по теме Управление памятью в Windows
  2. Работа с динамической памятью на языке C или C++:
    • Выполнить задание №1 согласно варианту с использованием различных способов выделения и освобождения динамической памяти:
      • Использование malloc, realloc, free
      • Использование new, delete (только на C++)
      • Использование VirtualAlloc, VirtualFree
      • Использование HeapAlloc, HeapFree
    • Выполнить задание №2 согласно варианту с использованием пользовательской кучи (функции HeapCreate, HeapAlloc, HeapReAlloc, HeapFree, HeapDestroy)

Варианты заданий

Задание №1

  1. Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и сумму чисел в массиве. Прибавить сумму чисел к каждому элементу массива, вывести массив на экран. Освободить память.
  2. Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и среднее значение чисел в массиве. Прибавить среднее значение к каждому элементу массива, вывести массив на экран. Освободить память.
  3. Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и максимальное число в массиве. Прибавить максимальное значение к каждому элементу массива, вывести массив на экран. Освободить память.
  4. Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и минимальное число в массиве. Прибавить минимальное значение к каждому элементу массива, вывести массив на экран. Освободить память.
  5. Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и количество четных чисел в массиве. Прибавить это количество к каждому элементу массива, вывести массив на экран. Освободить память.
  6. Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран содержимое массива и количество нечетных чисел в массиве. Прибавить это количество к каждому элементу массива, вывести массив на экран. Освободить память.
  7. Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран исходное содержимое массива и отсортированное по возрастанию содержимое. Освободить память.
  8. Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран исходное содержимое массива и отсортированное по убыванию содержимое. Освободить память.
  9. Создать динамический массив. Размер вводится пользователем. Заполнить массив случайными числами. Вывести на экран исходное содержимое массива, переставить числа в массиве в обратном порядке и вывести на экран. Освободить память.
  10. Создать динамический массив. Размер вводится пользователем. Заполнить массив элементами ряда Фибоначчи. Вывести на экран исходное содержимое массива, переставить числа в массиве в обратном порядке и вывести на экран. Освободить память.

Задание №2

Создать пользовательскую кучу. Создать динамический массив из указателей. Размер вводится пользователем. Для каждого элемента массива выделить память по отдельности из пользовательской кучи. Указатели на созданные элементы сохранить в массиве. Выполнить задание с этим массивом согласно варианта задания № 1. В конце освободить память, уничтожив пользовательскую кучу.

Контрольные вопросы

  1. Основные концепции:

    • Что такое динамическая память и как она отличается от статической памяти?
    • Какие проблемы могут возникнуть при неправильном использовании динамической памяти?
  2. Функции управления памятью:

    • Какие функции Windows API используются для работы с динамической памятью?
    • В чем различие между функциями HeapAlloc и VirtualAlloc?
    • Как освободить память, выделенную функцией HeapAlloc? А функцией VirtualAlloc?
  3. Кучи (Heap):

    • Что такое куча (heap) и как она используется для управления памятью?
    • Как создать и уничтожить кучу с помощью Windows API?
    • Какие параметры можно задать при создании кучи?
  4. Виртуальная память:

    • Что такое виртуальная память и как она управляется в Windows?
    • Какие преимущества и недостатки есть у использования виртуальной памяти по сравнению с кучей?
  5. Отладка и диагностика:

    • Каковы основные инструменты и методы отладки утечек памяти в Visual Studio?
    • Как обнаружить и исправить утечки памяти в программах?
  6. Оптимизация и эффективность:

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

    • Опишите процесс выделения и освобождения памяти с использованием функции HeapAlloc.
    • Приведите пример кода, использующего функции VirtualAlloc и VirtualFree.
    • Какие меры предосторожности необходимо соблюдать при работе с динамической памятью?
  8. Анализ и сравнение:

    • В каких случаях предпочтительно использовать кучу, а в каких — виртуальную память?
    • Какое влияние на производительность оказывает использование кучи и виртуальной памяти?
Лаб. работа "Операции с файлами в Windows" →