함께 C ++ 17 , shared_ptr
동적으로 할당 된 어레이를 관리하기 위해 사용될 수있다. shared_ptr
이 경우 템플릿 인수해야 T[N]
하거나 T[]
. 그래서 당신은 쓸 수 있습니다
shared_ptr<int[]> sp(new int[10]);
n4659부터 [util.smartptr.shared.const]
template<class Y> explicit shared_ptr(Y* p);
요구 사항 : Y
완전한 유형이어야한다. , 표현식 이 배열 유형일 때 또는 배열 유형이 아닌 delete[] p
경우 표현식 은 올바르게 정의 된 동작을 가지며 예외를 발생시키지 않습니다.
... 설명 : 때 어레이 타입 표현이없는 한,이 생성자 과부하 해상도에 참여하지 않아야한다 잘 형성되고 하나 이며 하고 로 변환 가능한 , 또는 인
및 으로 변환이다 . ...T
delete p
T
T
delete[] p
T
U[N]
Y(*)[N]
T*
T
U[]
Y(*)[]
T*
이를 지원하기 위해 멤버 유형 element_type
이 이제
using element_type = remove_extent_t<T>;
배열 요소는 다음을 사용하여 액세스 할 수 있습니다. operator[]
element_type& operator[](ptrdiff_t i) const;
필요합니다 : get() != 0 && i >= 0
. 경우 T
이다 U[N]
, i < N
. ...
설명 : 경우 T
배열 형이 아니라,이 멤버 함수가 선언되는지 여부를 지정한다. 선언 된 경우, 함수의 선언 (정의 일 필요는 없지만)이 올바르게 형성되는 것을 제외하고는 리턴 유형이 무엇인지 지정되지 않습니다.
앞서 C ++ 17 , shared_ptr
수 없습니다 동적으로 할당 된 배열을 관리 할 수. 기본적으로 더 이상 참조가 남아 있지 않으면 관리 대상 객체를 shared_ptr
호출 delete
합니다. 사용 할당 할 때, new[]
당신은 호출 할 필요가 delete[]
아닌 delete
, 리소스를 확보 할 수 있습니다.
shared_ptr
어레이와 함께 올바르게 사용하려면 사용자 정의 삭제기를 제공해야합니다.
template< typename T >
struct array_deleter
{
void operator ()( T const * p)
{
delete[] p;
}
};
다음과 같이 shared_ptr을 작성하십시오.
std::shared_ptr<int> sp(new int[10], array_deleter<int>());
이제 관리 대상 객체를 삭제할 때 shared_ptr
올바르게 호출 delete[]
합니다.
위의 맞춤 삭제 프로그램은 다음으로 대체 될 수 있습니다.
std::default_delete
어레이 타입 부분 특수화
std::shared_ptr<int> sp(new int[10], std::default_delete<int[]>());
람다 표현
std::shared_ptr<int> sp(new int[10], [](int *p) { delete[] p; });
또한 실제로 관리 대상 개체에 대한 공유 권한이 필요하지 않은 한, unique_ptr
배열 유형에 대한 부분 전문화 기능이 있기 때문에이 작업에 더 적합합니다.
std::unique_ptr<int[]> up(new int[10]); // this will correctly call delete[]
라이브러리 기초를위한 C ++ 확장에 의해 도입 된 변경 사항
위에 열거 된 것들에 대한 또 다른 C ++ 17 이전 대안은 Library Fundamentals Technical Specification에 의해 제공되었으며 , 이는 shared_ptr
객체 배열을 소유 한 경우에 대해 즉시 사용할 수 있도록 향상되었습니다. shared_ptr
이 TS에 예정된 변경 사항 의 현재 초안은 N4082 에서 찾을 수 있습니다 . 이러한 변경 사항은 std::experimental
네임 스페이스 를 통해 액세스 할 수 있으며 <experimental/memory>
헤더에 포함됩니다 . shared_ptr
배열 을 지원 하기 위해 관련된 몇 가지 변경 사항 은 다음과 같습니다.
— 멤버 유형의 정의가 element_type
변경됨
typedef T element_type;
typedef typename remove_extent<T>::type element_type;
— 회원 operator[]
추가 중
element_type& operator[](ptrdiff_t i) const noexcept;
- 달리 unique_ptr
배열 부분 특수화 양 shared_ptr<T[]>
및 shared_ptr<T[N]>
유효한 것 둘 초래할 것이다 delete[]
오브젝트 관리라는 배열된다.
template<class Y> explicit shared_ptr(Y* p);
요구 사항 : Y
완전한 유형이어야한다. 표현식이 delete[] p
때 T
, 어레이 형태, 또는 delete p
경우 T
배열 형없고, 잘 형성한다 잘 동작을 정의하며, 예외가 발생하지 않는다. 경우 T
이다 U[N]
, Y(*)[N]
로 변환한다 T*
; 경우 T
이다 U[]
, Y(*)[]
로 변환한다 T*
; 그렇지 않으면 Y*
로 변환 할 수 T*
있습니다.
std::vector
. 참조를 사용하여 배열을 전달하여 사본을 만들지 않도록주의해야합니다. 데이터 액세스 구문은 shared_ptr보다 깨끗하며 크기를 조정하는 것은 매우 쉽습니다. 그리고 원하는 모든 STL 장점을 얻을 수 있습니다.