Присвоение 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};
}