Назад к вопросам
Middle
81
questionbank
Какие умные указатели в C++ вы знаете?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
std::unique_ptr- уникальный владелец объекта, не может быть скопирован, но может быть перемещен.#include <memory> int main() { std::unique_ptr<int> ptr(new int(10)); // Создание // std::unique_ptr<int> ptr2 = ptr; // Компиляционная ошибка - нет копирования std::unique_ptr<int> ptr3 = std::move(ptr); // Перемещение владения return 0; }std::shared_ptr- разделяемый владелец, подсчитывает количество ссылок на объект. Объект удаляется, когда количество ссылок становится равным нулю.#include <memory> #include <iostream> int main() { std::shared_ptr<int> ptr(new int(20)); std::cout << "Refs: " << ptr.use_count() << std::endl; // 1 std::shared_ptr<int> ptr2 = ptr; // Копирование владельца std::cout << "Refs: " << ptr.use_count() << std::endl; // 2 ptr.reset(); // Уменьшение счетчика ссылок std::cout << "Refs: " << ptr2.use_count() << std::endl; // 1 return 0; }std::weak_ptr- не разделяемый владелец, используется для предотвращения циклических ссылок междуshared_ptr. Не увеличивает счетчик ссылок. Для доступа к объекту необходимо преобразовать вshared_ptrс помощью методаlock().#include <memory> #include <iostream> int main() { std::shared_ptr<int> shared_ptr(new int(30)); std::weak_ptr<int> weak_ptr = shared_ptr; // Создание weak_ptr if (auto locked_ptr = weak_ptr.lock()) { std::cout << "Value: " << *locked_ptr << std::endl; // Доступ к объекту } else { std::cout << "Object expired." << std::endl; } shared_ptr.reset(); // Объект удален if (auto locked_ptr = weak_ptr.lock()) { std::cout << "Value: " << *locked_ptr << std::endl; } else { std::cout << "Object expired." << std::endl; // Объект удален } return 0; }std::auto_ptr- устаревший (deprecated с C++11 и удаленный в C++17) умный указатель. Имел семантику перемещения при копировании, что могло привести к ошибкам. Вместо него следует использоватьstd::unique_ptr.
| Указатель | Семантика владения | Копирование | Перемещение | Циклические ссылки |
|---|---|---|---|---|
unique_ptr |
Уникальное | Нет | Да | Не применимо |
shared_ptr |
Разделяемое | Да | Да | Может вызвать |
weak_ptr |
Не владеет | Да | Да | Предотвращает |
auto_ptr |
Перемещающее (уст.) | Нет (прим.) | Неявно | Не применимо |