Присвоение shared_ptr смещению массива

Скажем, у меня есть shared_ptr для массива:

std::shared_ptr<int> sp(new T[10], [](T *p) { delete[] p; });

И метод:

shared_ptr<T> ptr_at_offset(int offset) {
    // I want to return a shared_ptr to (sp.get() + offset) here
    // in a way that the reference count to sp is incremented...
}

В основном то, что я пытаюсь сделать, это вернуть новый shared_ptr, который увеличивает счетчик ссылок, но указывает на смещение исходного массива; Я хочу избежать удаления массива, когда вызывающий использует массив при некотором смещении. Если я просто вернусь sp.get() + offset, что может случиться, верно? И я думаю, что инициализация нового shared_ptr, содержащего sp.get() + offset, тоже не имеет смысла.

Новый для С++, поэтому не уверен, что я правильно подошел.

Ответ 1

Вы можете использовать конструктор псевдонимов:

template< class Y > 
shared_ptr( const shared_ptr<Y>& r, element_type* ptr ) noexcept;

Это разделяет владение с данным shared_ptr, но обязательно очищается в соответствии с этим, а не указателем, который вы ему даете.

shared_ptr<T> ptr_at_offset(int offset) {
    return {sp, sp.get() + offset};
}