Почему для объекта подсчета ссылок shared_ptr требуется отслеживать количество слабых_ptrs, указывающих на объект?

Привет, я читаю этот документ и некоторые другие документы о С++ shared_ptr, и все они, кажется, считают, что помимо количества shared_ptr, указывающий на выделенный объект, объект счетчика ссылок должен отслеживать, сколько указателей weak_ptr указывает на объект. Почему мой вопрос? По моему мнению, weak_ptr не имеет права собственности, поэтому, если число shared_ptr, указывающее на объект, достигает нуля, объект может быть удален. Поэтому иногда нам нужно использовать expired, чтобы проверить доступность объекта, на который указывает weak_ptr. Не могли бы вы объяснить причину необходимости отслеживать количество weak_ptr s?

Зачем нам здесь нужен слабый счет? введите описание изображения здесь

Ответы

Ответ 1

std::weak_ptr ссылается на блок управления, чтобы узнать, существует ли объект и если да, предоставить std::shared_ptr ему, когда это необходимо. По этой причине блок управления должен существовать, если существует либо std::weak_ptr, либо std::shared_ptr. Вам нужно отслеживать количество экземпляров std::weak_ptr, чтобы знать, когда последний уничтожается, как и для std::shared_ptr.

Ответ 2

Счетчик ссылок shared_ptr - это количество владельцев объекта. Счетчик ссылок weak_ptr - это количество владельцев контрольного блока контрольных счетчиков.

Ответ 3

Добавление к ответу Франсуа Андри:

Существует побочный эффект, который очень важно понять.

Если вы используете реализацию std:: make_shared, которая использует оптимизацию WKWYL (мы знаем, где вы живете), выделяя блок управления и фактический объект вместе как одно непрерывное выделение, память НЕ БУДЕТ ЗАПРЕЩАЕТСЯ, пока все слабые_ptr объекты также вышли за рамки.

(моя учетная запись редко используется, поэтому я не могу добавлять комментарии из-за отсутствия достаточных точек репутации, добавляя в качестве ответа, а не комментария)