Найдите и исправьте ошибку во фрагменте на C++ с умными указателями, приводящую к утечке или двойному удалению:
std::unique_ptr p1(new int(5)); std::shared_ptr p2(p1.get());

18 Ноя в 17:18
2 +1
0
Ответы
1
Ошибка: вы создаёте `std::shared_ptr` из сырых указателя `p1.get()`, при этом `p1` (unique_ptr) и `p2` (shared_ptr) будут одновременно владеть одним и тем же объектом — при разрушении произойдёт двойное удаление (UB).
Правильное решение — передать владение из `unique_ptr` в `shared_ptr` через перемещение:
std::unique_ptr p1(new int(555));
std::shared_ptr p2 = std::move(p1); // p1 становится nullptr, p2 теперь владеет объектом
Альтернативы:
- Явно передать указатель и снять владение у unique_ptr:
std::shared_ptr p2(p1.release()); // передаёт владение; осторожно с исключениями
- Создать отдельный объект (копию) в shared_ptr:
std::shared_ptr p2 = std::make_shared(*p1); // не разделяет тот же адрес
Вывод: никогда не передавайте `unique_ptr.get()` в конструктор `shared_ptr` — используйте `std::move` или `release` для корректной передачи владения.
18 Ноя в 17:25
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир