Два shared_ptr, созданные из одного сырого указателя
В модуле работы с устройством встретился такой код:
Device *raw = new Device();
std::shared_ptr<Device> a(raw);
std::shared_ptr<Device> b(raw);
// оба указателя живут до конца области видимости
Что произойдёт при выходе из области видимости?
- Счётчик ссылок станет равен двум, объект будет удалён ровно один раз — код корректен, хотя и написан неаккуратно
- Второй конструктор бросит std::bad_weak_ptr, потому что объект уже находится под управлением другого shared_ptr
- Получится утечка: сырой указатель уже передан во владение, и второй shared_ptr откажется удалять этот объект
- Каждый shared_ptr завёл собственный блок управления со счётчиком 1, поэтому объект будет удалён дважды
