Почему для объекта подсчета ссылок 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 объекты также вышли за рамки.
(моя учетная запись редко используется, поэтому я не могу добавлять комментарии из-за отсутствия достаточных точек репутации, добавляя в качестве ответа, а не комментария)