Почему умные указатели заменяют обычные new и delete
Изучите RAII и поймите, почему владение обычными указателями редко бывает правильным решением в современном C++.
«Почему умные указатели заменяют обычные new и delete» — бесплатный урок C++ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Необработанные new и delete
Наследие языка C: new T выделяет объект T в куче, а delete освобождает его. Для каждого new необходимо ровно один раз вызвать delete — иначе возникнет утечка или сбой.
Widget* w = new Widget();
// ... use w ...
delete w; // forget this and you leakЧто может пойти не так
Распространённые ошибки:
- Забытый
delete— утечка памяти - Двойной
delete— неопределённое поведение - Исключение между
newиdelete— утечка - Возврат необработанного указателя с неясным владением
На помощь приходит RAII
Получение ресурса — это инициализация: свяжите время жизни ресурса со временем жизни объектa в стеке. Деструктор освобождает ресурс, даже если выброшено исключение.
Идея умного указателя
Умный указатель — это небольшая оболочка RAII вокруг необработанного указателя. Его деструктор вызывает delete. Вы больше не забудете освободить память.
Три умных указателя
Умные указатели стандартной библиотеки в <memory>:
std::unique_ptr<T>— исключительное владениеstd::shared_ptr<T>— совместное владение со счётчиком ссылокstd::weak_ptr<T>— наблюдатель без владения для shared_ptr
Умные указатели почти ничего не стоят
unique_ptr не создаёт дополнительных затрат: он имеет тот же размер и скорость, что и необработанный указатель. У shared_ptr есть небольшие затраты на атомарный счётчик ссылок.
Больше никакого ручного delete
С умными указателями Вам почти никогда не придётся писать delete. Деструктор позаботится об этом.
#include <memory>
std::unique_ptr<Widget> w = std::make_unique<Widget>();
// no delete needed — when w goes out of scope, Widget is destroyedУмные указатели и исключения
Если в середине функции выброшено исключение, локальные переменные уничтожаются в обратном порядке. Умные указатели автоматически освобождают свои ресурсы, а необработанные указатели приводят к утечкам.
Владение закодировано в типе
Теперь тип умного указателя кодирует владение. По сигнатуре функции можно понять, кто владеет объектом.
// I take ownership
void consume(std::unique_ptr<Widget> w);
// I look but do not own
void inspect(const Widget& w);Необработанные указатели всё ещё нужны
Используйте необработанные указатели или ссылки для доступа без владения. Они сообщают: «Я заимствую объект, а не владею им».
Замена new функциями make
Предпочитайте std::make_unique (C++14) и std::make_shared (C++11). Они безопасны при работе с исключениями и немного эффективнее прямого вызова new.
auto w = std::make_unique<Widget>(42);
auto s = std::make_shared<Resource>("file.txt");Быстрая проверка
Какова главная причина использовать std::unique_ptr вместо необработанной пары new/delete?
Итоги
Необработанные new/delete легко приводят к ошибкам. Умные указатели оборачивают выделенные в куче объекты в оболочки RAII, которые освобождают ресурсы автоматически. Для безопасности и производительности предпочитайте std::make_unique и std::make_shared.
Часто задаваемые вопросы
Урок «Почему умные указатели заменяют обычные new и delete» бесплатный?
Да — полный текст урока «Почему умные указатели заменяют обычные new и delete» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Почему умные указатели заменяют обычные new и delete»?
Изучите RAII и поймите, почему владение обычными указателями редко бывает правильным решением в современном C++. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Почему умные указатели заменяют обычные new и delete»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему умные указатели заменяют обычные new и delete
- unique_ptr: исключительное владение
- shared_ptr и weak_ptr: совместное владение
- Пользовательские удалители и функции make