2012-01-20 3 views
61

표준이 제대로 소멸자에서 delete[] 호출 std::unique_ptr의 템플릿 특수화 제공 : std::shared_ptrstd :: shared_ptr <T[]> 전문화가없는 이유는 무엇입니까?

void func() 
{ 
    std::unique_ptr<int[]> arr(new int[10]); 

    ....... 
} 

는이 전문을 사용할 수 없습니다를, 그래서 제대로 delete[]를 호출하는 Deleter가를 제공하기 위해 할 필요가 :

void func() 
{ 
    // Usage 
    shared_ptr array (new double [256], [](double* arr) { delete [] arr; }); 

    .............. 
} 

이것은 단순히 감독입니까? (같은 방식으로 std::copy_if가 있습니다) 또는 이유가 있습니까?

+3

N.B를 참조하십시오. Boost의 작업을 기반으로 C++ 17에 이것을 추가하는 새로운 제안이 있습니다 (http://open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3640.html –

+0

). 하위 객체를 참조 할 수있는 능력과 같이 배열을 사용하여 작업 할 때는'shared_ptr' 기계류의 기능을 비활성화해야합니다. –

답변

65

LWG (C++위원회의 도서관 워킹 그룹)는 가능성을 간략하게 고려했으나 논란의 여지가 없었습니다. 이 논란은 주로 던져 졌을 수도있는 shared_ptr<T[]> 제안에 추가 된 기능에 관한 것이었지만 (shared_ptr<T[]>에 대한 산술).

그러나 궁극적으로 진정한 진정한 이유는 논의되었지만 LWG 앞에 실제 서면 제안이 없었기 때문입니다. 제안서 작성에 시간을 할애하기에 충분한 사람의 우선 순위 목록 (내 자신 포함)을 버블 링하지 않았습니다.

몇 명의 LWG 회원 중에서 비공식 대화가 최근에 시작되어 개인적으로 프로토 타입을 작성했습니다. 그러나 그것에 대한 서면 제안은 아직 없습니다. 도구 상자에 추가 도구가 필요하다고 생각합니다. 그것이 실제로 일어날 지 아닌지는 누구나 추측 할 수 있습니다. shared_ptr위한

업데이트

어레이 지원 지금 임시 TS를 가지고

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4077.html

업데이트 (2017)

이 이제 C++ (17)에지지된다. 케이스 3은 shared_ptr::shared_ptr()

+2

처음으로 "왜 거기에 없습니까?"라는 질문에 대한 답변은 내가 본 것, 동적으로 할당 된 배열입니까? vector와 std :: array를 사용하면 실제로 필요성이 보이지 않는다. (?) – Nim

+12

@Nim :'std :: unique_ptr '(존재하는)은 오버 헤드가 엄청나게 중요 할 때 유용하다. '벡터 '와는 달리, 'unique_ptr '는 용량이나 심지어는 크기에 대한 오버 헤드를 포함하지 않습니다. 클라이언트는 크기에 대한 외부 오버 헤드를 추가해야하지만 용량이 아닌 배열의 크기가 조정되지 않는 경우가 있습니다. 이제 이것은'unique_ptr '더 좋은'벡터 '을 만들지 않습니다. 사실 전 전자의 유스 케이스는 후자와 비교하여 희소 할 것입니다. 그러나 유스 케이스의 유스 케이스 비율은 0이 아니다. –

+3

비슷하게,'shared_ptr '은 때때로 더 낮은 오버 헤드로'shared_ptr '를 대체 할 수 있습니다. 'boost :: shared_array '의 단순한 존재와 지속적인 지원은 일부 프로그래머들이 때때로 그러한 도구를 유용하게 사용할 수 있다는 논증입니다. –

관련 문제