0Pricing
C++ Academy · Урок

Почему умные указатели заменяют обычные 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 — локальная установка не требуется.

Все уроки этого курса

  1. Почему умные указатели заменяют обычные new и delete
  2. unique_ptr: исключительное владение
  3. shared_ptr и weak_ptr: совместное владение
  4. Пользовательские удалители и функции make
← Назад к C++ Academy