Здесь приведена цитата из раздела примечания реализации cppreference в std::shared_ptr
, в которой упоминается, что существуют два разных указателя (как показано жирным шрифтом): тот, который может быть возвращен get()
, и тот, который содержит фактические данные внутри блок управления.
В типичной реализации
std::shared_ptr
содержит только два указателя:
- сохраненный указатель (один возвращается
get()
)- указатель на блок управления
Управляющий блок представляет собой объект с динамическим распределением, который содержит:
- либо указатель на управляемый объект, либо сам управляемый объект
- удаляющий (стираемый тип)
- распределитель (тип-стертый)
- количество
shared_ptrs
, которому принадлежит управляемый объект- число
weak_ptrs
, относящееся к управляемому объектуУказатель, удерживаемый
shared_ptr
напрямую, - это тот, который возвращаетсяget()
, в то время как указатель или объект, удерживаемый блоком управления, является тем, который будет удален, когда количество общих владельцев достигнет нуля. Эти указатели не обязательно равны.
Мой вопрос: зачем нужны два разных указателя (выделенные жирным шрифтом) для управляемого объекта (в дополнение к указателю на блок управления)? Достаточно ли того, что возвращается get()
? И почему эти указатели не обязательно равны?