2017-09-27 1 views
10

이의 내가 배열에 shared_ptr 있다고 가정 해 봅시다 참조 카운트를 증가 시키지만 원래 배열의 오프셋을 가리키는 새로운 shared_ptr을 반환하십시오. 호출자가 일부 오프셋에서 배열을 사용하는 동안 배열을 삭제하지 않도록하고 싶습니다. 일어날 수있는 sp.get() + offset을 반환하면 되겠습니까? 그리고 새로운 shared_ptr을 초기화하면 sp.get() + offset을 포함한다고 생각하지 않습니다.배열의 오프셋에 shared_ptr을 할당

C++을 처음 사용하면이 문제가 올바르게 해결되는지 확실하지 않습니다.

+2

원시 배열 대신'std :: array'를 사용하는 것이 좋습니다. 그러면'std :: make_shared'를 사용하고 커스텀 deleter를 피할 수 있습니다 :'auto p = std :: make_shared >(); std :: shared_ptr p2 {p, & p-> at (n)}; ' –

+0

아 좋아, 더 편리하다. – ujvl

+1

그 질문은 정말 좋은 질문이다. 전에는 문제가 없었지만 미래에 대해 감사드립니다. – ZeroUltimax

답변

17

사용할 수 있어야 aliasing constructor :

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}; 
}