Понимание слабого счетчика ссылок
При создании shared_ptr объект диспетчера использует сильные и слабые счетчики ссылок. Я понимаю, что при использовании сильного счетчика ссылок shared_ptr знает, когда освободить управляемый объект, но я не понимаю, почему он использует слабый счетчик ссылок.
3 ответов:
Есть два объекта, связанные с
shared_ptr<T>&weak_ptr<T>:Фактический объект будет уничтожен, если общий счетчик достигнет
- фактический объект (
T)- блок управления, содержащий общие и слабые счетчики
0. Но блок управления должен оставаться живым до тех пор, пока существуют общие или слабые указатели, то есть блок управления будет удален, как только будут удалены как общие, так и слабые счетчики.0.
Как слабые, так и сильные указатели содержат указатель на данные и указатель на блок подсчета ссылок.
При попытке преобразовать слабый указатель в сильный указатель добавляется новый сильный счетчик. Если он увеличивается от 0, вы знаете, что данные уже были уничтожены, поэтому вы терпите неудачу. Для этого требуется доступ к блоку подсчета ссылок.
Таким образом, время жизни блока подсчета ссылок должно превышать время жизни всех оставшихся слабых указателей.
Это обеспечивается подсчет ссылок блок подсчета ссылок со слабым подсчетом ссылок. Этот счетчик ссылок, уменьшенный до нуля последней выдающейся сильной или слабой ссылкой, выходящей за пределы области видимости, заставляет интеллектуальный указатель уничтожить блок счетчика ссылок.
weak_ptrиспользуется для вещей, которые нуждаются в дескрипторе для рассматриваемого объекта кучи, но не хотят претендовать на какое-либо владение, которое блокировало бы освобождение объекта. Типичным примером таких вещей являются наблюдатели, которые хотят знать о любых изменениях в базовом объекте, но не хотят держать его рядом, если никто другой не использует этот объект.
Comments