我知道共享指针意味着共享相同的内存。但是,如果我的共享指针指向的元素不是另一个共享指针内存中的第一个元素,该怎么办?
考虑一个原始指针示例:
int* array = new int[10];
int* segment = &array[5];
我可以对共享指针array
和segment
做同样的事情吗?在这种情况下,他们会计算参考文献吗?
std::shared_ptr
有一个别名构造函数,正是针对这种情况:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, element_type* ptr ) noexcept;
别名构造函数:构造一个
shared_ptr
,该与初始值r
共享所有权信息,但持有不相关且不受管理的指针ptr
。如果此shared_ptr
是组中最后一个超出范围的,它将为最初由r
管理的对象调用存储的deleter
。但是,在此shared_ptr
上调用get()
将始终返回ptr
的副本。程序员有责任确保只要此shared_ptr
存在,此ptr
就保持有效,例如在典型的用例中,ptr
是r
管理的对象的成员,或者是r.get()
的别名(例如,向下转换)
例如:
auto array = std::make_shared<int[]>(10);
auto segment = std::shared_ptr<int>(array, &array[5]);