Скачиваний:
184
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

Тема 1: Динамическая память и интеллектуальные указатели

1. Особенности использования динамической памяти (распределяемая память, heap, freestore), стека. Примеры использования.

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

Кроме статической памяти и стека у каждой программы есть пул памяти. Это свободная или распределяемая память. Она используется для динамически созданных объектов, место для которых выделяется во время выполнения программы. Программа должна контролировать продолжительность существования динамических объектов – это ответственность программиста. Продолжительность существования объектов, созданных динамически, не зависит от того, где они созданы. Они существуют до тех пор, пока не будут освобождены явно. Необходимо гарантировать освобождение памяти в нужный момент. Если не освободить вовремя (поздно), возникает утечка памяти, если освободить слишком рано, то возникает потерянный указатель.

2. Особенности выделения и освобождения памяти для автоматических глобальных и локальных объектов, статических глобальных и локальных объектов. Примеры использования.

Глобальные объекты создаются при запуске приложения и освобождаются по завершении программы. Хранятся в статической памяти.

const int SIZE = 100; int main() { … }

// будет создан при запуске, удален при завершении программы

Локальные объекты, которые являются автоматическими, создаются при входе в блок, где они определены, и удаляются при выходе из блока. Хранятся в стеке.

void func() { int i = 0; … }

// будет создан при входе в блок, удален при выходе

Локальные объекты, которые являются статическими, создаются перед первым их использованием и удаляются по завершении приложения. Хранятся в статической памяти.

void func() { static int i = 0; … }

// будет единожды создан при первом входе в блок,

// удален при завершении программы

3. Операторы new и delete при работе с динамической памятью. Свойства указателей, передаваемых оператору delete. Примеры использования.

Распределяемая память используется для динамически созданных объектов, место для которых выделяется во время выполнения программы. Программа должна контролировать продолжительность существования динамических объектов – это ответственность программиста. Продолжительность существования объектов, созданных динамически, не зависит от того, где они созданы. Они существуют до тех пор, пока не будут освобождены явно. Необходимо гарантировать освобождение памяти в нужный момент. Если не освободить вовремя (поздно), возникает утечка памяти, если освободить слишком рано, то возникает потерянный указатель.

Для управления распределением памяти в С++ используются операторы new и delete. Оператор new резервирует (а при необходимости и инициализирует) объект в динамической памяти и возвращает указатель на него. Оператор delete получает указатель на динамически созданный объект и удаляет его, освобождая память.

int *p = new int; *p = 2; delete p;

int *p = new int[10];

for (int i = 0; i < 10; i++) *(p + i) = i;

delete[] p;

int *p = new int(2); delete p;

Поскольку объем кучи конечен, она может когда-нибудь исчерпаться. Если для удовлетворения очередного запроса на выделение памяти не существует достаточно свободной памяти, оператор new потерпит фиаско, и будет сгенерировано исключение. Если это исключение не будет обработано программой, ее выполнение будет прекращено.