指向属于另一个共享指针的内存部分的共享指针

Kai*_*kha 0 c++ smart-pointers

我知道共享指针意味着共享相同的内存。但是,如果我的共享指针指向的元素不是另一个共享指针内存中的第一个元素怎么办?

考虑一个原始指针示例:

int* array = new int[10];
int* segment = &array[5];
Run Code Online (Sandbox Code Playgroud)

array我可以用共享segment指针做同样的事情吗?在这种情况下他们会计算参考文献吗?

Rem*_*eau 5

std::shared_ptr对于这种情况有一个别名构造函数:

template< class Y >
shared_ptr( const shared_ptr<Y>& r, element_type* ptr ) noexcept;
Run Code Online (Sandbox Code Playgroud)

别名构造函数:构造一个shared_ptr与 的初始值共享所有权信息的r,但持有一个不相关且非托管的指针ptr。如果这shared_ptr是该组中最后一个超出范围的,它将调用deleter最初由 管理的对象的存储r。然而,调用get()shared_ptr总是会返回ptr. 程序员有责任确保ptr只要它shared_ptr存在,它就保持有效,例如在典型的用例中,其中ptr是由 管理的对象的成员r,或者是 的别名(例如,向下转换)r.get()

例如:

auto array = std::make_shared<int[]>(10);
auto segment = std::shared_ptr<int>(array, &array[5]);
Run Code Online (Sandbox Code Playgroud)