Динамическая память и 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 ручному управлению памятью. Если используешь низкоуровневое выделение, заранее определи владельца и точку освобождения ресурса.
