2016-12-14 1 views
4

는 오퍼레이터 I 여전히 사용할 수없고 경우 I 유사한 액세스를 얻기 어떻게 인덱싱 벡터 기반 포인터 (http://en.cppreference.com/w/cpp/memory/shared_ptr/operator_at)표준 : shared_ptr의 연산자 [] 동등한 액세스

을 허용하는 operator []을 갖는다 이처럼

std::shared_ptr<unsigned char> data; 
data.reset(new unsigned char[10]>; 
// use data[3]; 
+3

AFAIK 사전 C++를 17'shared_ptr'에 배열 타입을 가질 수 없습니다. 지금 당장 UB로가는 틀린 삭제자가 생길 것입니다. – NathanOliver

+1

@ NathanOliver 분명히 OP는 올바른 Deleter와 함께 할 수 있습니까? (OP는 제공하지 않음). – user2079303

+0

@ user2079303 좋은 지적. 사용자 정의 삭제 자 전달하는 것을 잊었습니다. – NathanOliver

답변

8

:

data.get()[3] 

Howev 같은 요소의 배열을위한 스마트 포인터를 사용하려면 네이선이 논평에서 말한 것을 명심하십시오. 기본 삭제 자 std::shared_ptr<unsigned char>new[]에 의해 할당 된 포인터가 잘못되었습니다. 당신은 적절한 Deleter가 함께 std::shared_ptr::reset(Y* ptr, Deleter d);를 사용해야합니다 : 당신이 람다의 추함을 좋아하지 않는 경우에,

data.reset(new unsigned char[10], [](auto p){ delete[] p; }); 

또는, 재사용 가능한 도우미 정의 할 수 있습니다 :

struct array_deleter { 
    template<typename T> void operator()(const T* p) { 
     delete[] p; 
    } 
}; 

// ... 

data.reset(new unsigned char[10], array_deleter()); 
+0

감사합니다. 그래서, 그것은'data.reset (새로운 unsigned char [10], delete [])'을 사용해야한다는 것을 의미합니까? – rkioji

+1

@rkioji는 구문 상 올바르지 않습니다. 예제를 보려면 편집을 참조하십시오. – user2079303

관련 문제