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