Back to questions
Junior — Middle
81
Какие типы умных указателей существуют в C++ и чем они отличаются по своему поведению?
Answer from AI
sobes.tech AI
В C++ существуют три основных типа умных указателей, которые помогают управлять временем жизни объектов и предотвращают утечки памяти:
-
std::unique_ptr — владеет объектом эксклюзивно. Объект удаляется, когда unique_ptr выходит из области видимости. Нельзя копировать, можно только перемещать.
-
std::shared_ptr — разделяет владение объектом между несколькими указателями. Объект удаляется, когда последний shared_ptr, владеющий им, уничтожается.
-
std::weak_ptr — не владеет объектом, а лишь ссылается на него через shared_ptr. Позволяет проверить, существует ли объект, не увеличивая счетчик ссылок.
Пример:
#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;
}
}
Таким образом, выбор умного указателя зависит от требований владения и управления временем жизни объекта.