Найдите и исправьте ошибку во фрагменте на C++ с умными указателями, приводящую к утечке или двойному удалению: std::unique_ptr p1(new int(5)); std::shared_ptr p2(p1.get());
Ошибка: вы создаёте `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` для корректной передачи владения.
Правильное решение — передать владение из `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` для корректной передачи владения.