В каком смысле слабый_птр «владеет» разделяемым_птром? - PullRequest
0 голосов
/ 12 июня 2018

Я пытался написать заголовок для этого вопроса в течение примерно 10 минут, и, как вы увидите, я в итоге потерпел неудачу.[Примечание редактора: я думаю, что исправил это.]

Я читал блог Херба Саттера , и тема использует std :: make_shared и его минусы и плюсы.Пожалуйста, смотрите прикрепленную фотографию:

enter image description here

Это небольшая часть очень очень интересной статьи , которую я настоятельно рекомендую прочитать людям,Мой вопрос касается этого предложения:

Подсчет «слабых ссылок» для отслеживания количества слабых_птров, наблюдающих в данный момент объект.Блок управления общим обслуживанием уничтожается и освобождается (а общий объект освобождается, если он еще не был), когда исчезает последняя слабая ссылка. **

Я действительно не понимаю этого утверждения.Первоначально, когда мы создаем std::shared_ptr на make_shared, например, auto sp1 = make_shared<widget>();, в настоящее время нет слабых ptrs, наблюдающих sp1, поэтому он будет удален, когда shared_ptr выйдет из области видимости обычным способом.

Итак, как добавление слабой ссылки меняет это поведение?Может кто-нибудь объяснить это мне, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Проще говоря, shared_ptr владеет управляемым объектом и метаинформацией (блок управления), а weak_ptr владеет только метаинформацией.

Владение означает, что:

  • когда у ресурса есть владелец, он не уничтожается (или «не освобождается» способом, определенным при создании «умного указателя») *
  • при жизнивсех владельцев закончились, ресурс уничтожен / освобожден.

Часть подсчета ссылок - это деталь реализации.(У вас может быть связанный список, если вы любите очень неэффективные реализации с мьютексом вместо относительно эффективных атомных счетчиков.)

0 голосов
/ 12 июня 2018

Блок управления следит за всеми ссылками слабого_птр, а также ссылками общего_птр.В конце концов, weak_ptr нужно посмотреть где-то , чтобы увидеть, является ли объект еще действительным.

Следовательно, блок управления не может быть отменен до тех пор, пока все shared_ptr s и все weak_ptr были уничтожены.Если вы используете make_shared, блок управления и объект размещаются вместе, что в основном является оптимизацией, , за исключением , если объект переживается любым weak_ptr с.

...