Назад к вопросам
Junior
86
questionbank
Какие существуют умные указатели в C++?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
std::unique_ptr, std::shared_ptr, std::weak_ptr.
-
std::unique_ptr:- Эксклюзивное владение объектом.
- Не может быть скопирован, но может быть перемещен (
std::move). - Автоматически удаляет объект при выходе из области видимости или уничтожении
unique_ptr. - Легковесен, не имеет накладных расходов на счетчик ссылок.
#include <memory> // Создание unique_ptr std::unique_ptr<int> up1(new int(10)); // Перемещение владения std::unique_ptr<int> up2 = std::move(up1); // up1 теперь nullptr // up2 владеет объектом -
std::shared_ptr:- Совместное владение объектом.
- Использует счетчик ссылок для отслеживания количества объектов
shared_ptr, указывающих на ресурс. - Объект удаляется, когда последний
shared_ptrна него уничтожается. - Возможно копирование и перемещение.
- Имеет накладные расходы на счетчик ссылок (обычно аллоцируется отдельно).
- Возможно образование циклических ссылок, что приводит к утечкам памяти.
#include <memory> // Создание shared_ptr std::shared_ptr<int> sp1 = std::make_shared<int>(20); // Копирование владения std::shared_ptr<int> sp2 = sp1; // Счетчик ссылок увеличивается // sp1 и sp2 владеют объектом -
std::weak_ptr:- Не владеет объектом.
- Представляет собой "слабую" ссылку на объект, управляемый одним или несколькими
shared_ptr. - Используется для предотвращения циклических ссылок между
shared_ptr. - Не увеличивает счетчик ссылок объекта.
- Для безопасного доступа к объекту необходимо преобразовать в
shared_ptrс помощью методаlock(). Если объект уже удален,lock()вернет пустойshared_ptr.
#include <memory> // Создание shared_ptr std::shared_ptr<int> sp = std::make_shared<int>(30); // Создание weak_ptr из shared_ptr std::weak_ptr<int> wp = sp; // Проверка и использование объекта if (auto shared_from_weak = wp.lock()) { // Доступ к объекту через shared_from_weak } else { // Объект уже удален }