Статьи

Учебные материалы по языку C++ — от основ до продвинутых тем

Динамическая память и RAII

Страница 21 из 43 · 2026-10-25 · 1 мин чтения

Динамическая память и RAII

Автоматическая и динамическая память

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

int* value = new int(42);std::cout << *value << '\n';delete value;value = nullptr;

Для массивов new[] должен соответствовать delete[]. Несоответствие форм освобождения приводит к неопределённому поведению.

Почему ручное управление опасно

  • Утечка памяти: ресурс не освобождён.
  • Двойное освобождение: одна память освобождена дважды.
  • Use-after-free: обращение после освобождения.
  • Исключение или ранний return пропускает delete.

Поэтому в современном C++ прямые new и delete обычно не нужны в прикладном коде.

RAII

RAII — принцип, при котором ресурс принадлежит объекту, а освобождается его деструктором. Когда объект выходит из области видимости, ресурс освобождается автоматически, даже если управление покидает блок из-за исключения.

Стандартная библиотека применяет RAII для строк, контейнеров, файловых потоков, блокировок и умных указателей.

Контейнеры вместо массивов в куче

std::vector<int> values(100, 0);values.push_back(42);

std::vector сам управляет памятью и хранит размер. Не нужно вручную выделять массив через new int[n].

Владение через умные указатели

auto object = std::make_unique<MyClass>();

std::unique_ptr выражает единоличное владение. std::shared_ptr используй только тогда, когда действительно требуется совместное владение. std::weak_ptr позволяет ссылаться на объект, управляемый shared_ptr, не продлевая его жизнь.

Итог

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