На C++ показан код с умными указателями: 'std::shared_ptr a = std::make_shared(); std::shared_ptr b = a; a.reset();' Объясните, когда объект будет уничтожен и как избежать циклических ссылок

27 Мар в 17:15
14 +1
0
Ответы
1
При выполнении кода:
std::shared_ptr a = std::make_shared();
std::shared_ptr b = a;
a.reset();
происходит следующее:
- `std::make_shared` создаёт объект и сопутствующий control block с количеством сильных ссылок (strong count) равным 111.
- При `b = a` strong count увеличивается до 222.
- При `a.reset()` strong count уменьшается до 111. Объект НЕ будет уничтожен, пока strong count не станет равен 000.
- Когда последний `std::shared_ptr` (в данном примере `b`) будет сброшен или выйдет из области видимости и strong count станет 000, объект будет уничтожен; control block будет уничтожен только когда и weak count станет тоже 000.
Циклические ссылки и как их избежать:
- Цикл вида A содержит `std::shared_ptr` и B содержит `std::shared_ptr` приведёт к утечке: strong count для объектов никогда не достигнет 000.
- Решения:
1. Разорвать цикл, заменив одну ссылку на `std::weak_ptr` (обычно — «обратную»/владельческую ссылку). Пример:
```
struct B;
struct A { std::shared_ptr b; };
struct B { std::weak_ptr a; };
```
Теперь weak_ptr не увеличивает strong count, цикл не мешает уничтожению.
2. Использовать `std::unique_ptr` в одной из сторон, если возможна единоличная владение.
3. Явно сбрасывать (`reset()`) одну из shared-ссылок, если логика позволяет.
4. При необходимости получать shared-объект из объекта — использовать `std::enable_shared_from_this` и `weak_ptr` для «обратных» ссылок.
Кратко: объект будет уничтожен, когда strong count станет 000. Чтобы избежать циклических ссылок, разбивайте их с помощью `std::weak_ptr` (или `unique_ptr` / явного сброса).
27 Мар в 17:47
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир