Он «обычно хранится» в любом месте, необходимом для проектирования объекта.Интрузивные умные указатели требуют T
, с которым они используются, чтобы обеспечить хранилище для подсчета ссылок.Вот что делает их «навязчивыми»;они вторгаются в объект.
Указанный вами дизайн "может взять произвольный объект".Таким образом, навязчивый дизайн исключен из таблицы.
Поскольку многие экземпляры интеллектуального указателя должны иметь доступ к одному и тому же объекту подсчета ссылок, этот счетчик ссылок должен быть независимым от любого одного экземпляра.И поскольку он также должен быть независимым от T
, он должен быть объектом, время жизни которого не зависит ни от T
, ни от любого экземпляра интеллектуального указателя, который на него ссылается.
Таким образом, интеллектуальный указатель при получении права собственностиT
, также должен создать объект подсчета ссылок для управления им.Как правило, это делается с помощью кучи, выделяющей такой объект.Копии интеллектуального указателя также получают указатель на счетчик ссылок.
По этой же причине недопустимо, чтобы два разных конструктора std::shared_ptr
претендовали на владение одним и тем же T*
.Вы можете скопировать из shared_ptr
, которому уже принадлежит T*
, но вы не можете просто передать сам T*
непосредственно в конструктор.Поскольку T
не имеет доступа к счетчику ссылок, конструктор shared_ptr
не будет знать, что им владеет кто-то другой, поэтому он создаст второй блок подсчета ссылок.