Назад к вопросам
СБЕР
Junior — Middle
93
Объясните отличия между умными указателями std::unique_ptr, std::shared_ptr и std::weak_ptr в C++
Компании, где спрашивали
РозумСофт
Ответ от нейросети
sobes.tech AI
std::unique_ptr — умный указатель, который владеет объектом эксклюзивно. Он не копируемый, только перемещаемый, что гарантирует единственного владельца ресурса. При уничтожении unique_ptr освобождает управляемый объект.
std::shared_ptr — умный указатель с подсчётом ссылок. Несколько shared_ptr могут владеть одним объектом. Объект удаляется, когда последний shared_ptr уничтожается или переназначается.
std::weak_ptr — слабая ссылка на объект, управляемый shared_ptr. Не влияет на подсчёт ссылок, используется для предотвращения циклических зависимостей. Чтобы получить доступ к объекту, нужно преобразовать weak_ptr в shared_ptr через метод lock().
Пример:
#include <memory>
#include <iostream>
int main() {
std::unique_ptr<int> uptr = std::make_unique<int>(10);
// std::unique_ptr<int> uptr2 = uptr; // Ошибка: нельзя копировать
std::shared_ptr<int> sptr1 = std::make_shared<int>(20);
std::shared_ptr<int> sptr2 = sptr1; // Подсчёт ссылок увеличивается
std::weak_ptr<int> wptr = sptr1; // Не увеличивает счётчик
if (auto spt = wptr.lock()) { // Проверяем, что объект ещё жив
std::cout << *spt << std::endl;
}
}