2017-12-12 1 views
0

Allocator이 표준 라이브러리 할당 자 인터페이스를 준수하는 경우 null 포인터로 std::allocator_traits<Allocator>::deallocate을 호출해도 안전합니까? Allocatorstd::allocator 일 때 (결국 궁극적으로 delete을 사용하기 때문에) 알고 있지만, Allocator이 클라이언트 제공 클래스 인 경우 어떻게됩니까? 나는 명백한 수표를해야합니까? 의 기사에 Allocator concept에 대한 보증이 나와 있지 않으므로 "예"라고 대답하고 싶습니다.널 포인터에 대해 allocator_traits :: deallocate 호출

질문에 대한 의욕을 조금 갖기 위해 변수 p이 버퍼 포인터를 보유하기로되어 있고 (처음에는 nullptr) 버퍼가있는 유스 케이스를 상상할 수 있습니다. 처음에는 할당되지 않으므로 p은 널 포인터로 남습니다.

+0

저장 장치에 대한 포인터가 nullptr이고 개체 수가 0보다 많다는 뜻입니까? –

+0

개체 수가 0인지 아닌지에 따라 대답이 달라 집니까? –

+0

제 질문은 그 할당자가 nullptr을 할당 할 수 있다면 nullptr도 할당 해제에 유효한 인수라는 것입니다. 그러나 개체의 수가 0보다 큰 경우 nullptr을 반환하는 이유를 상상할 수 없습니다. –

답변

2

우선 std::allocator<T>::deallocate(T* p, std::size_t)이 아니고delete p입니다. 대신에 23.10.9.1 절 [allocator.members] 7 절에 따라 operator delete(p)을 호출한다. 대신에 동일한 단락의 5 절의 요구 사항은 pstd::allocator<T>::allocate()에서 얻어 져야한다고 명시하고있다. 이 함수는 널 포인터를 반환 할 수 없습니다. 즉, std::allocator<T>::deallocate()은 널 포인트를 허용하지 않습니다. 할당 자 개념이 std::allocator<T>이 해당 개념을 모델링하지 않았으므로 null 포인터를 전달할 수 있다는 것은 놀라운 일입니다.

표 31의 할당 자 개념은 마찬가지로 a.deallocate(p)에 대한 인수가 a.allocate()에서 가져와 져야 함을 요구합니다. a.allocate(n)의 사양은 항상 n 개체에 대해 충분한 메모리를 반환하기 때문에 (유일한 오류 표시는 예외를 통해 발생 함) a.deallocate()은 null 포인터를 처리 할 것으로 예상되지 않습니다.

질문은 allocator_traits<...>::deallocate()에 관한 것입니다. 그러나 23.10.8.2 [allocator.traits.members] 단락 3에 따르면이 함수는 할당 자의 deallocate() 함수에 위임합니다. 즉, null 포인터는 유효한 인수가 아닙니다.

+0

주어진 숫자 객체가 0 일 때 Allocator :: allocate가 반환하는 객체는 지정되지 않습니다. "지정되지 않음"은 구현 (또는 사용자 정의 할당 자)이 지정하는 유효한 값을 의미합니다. 그것은 nullptr 수 없습니까? –

+0

@ ÖöTiib : 할당 자의 구현은 객체의 크기가 0 인 시퀀스에 대한 표현으로 'nullptr'을 사용하도록 선택할 수 있습니다. 그러나, 그렇게 할 것이라는 보장은 없다. 즉, 사용자는'nullptr '이 유효한 표현이라는 가정을 할 수 없다. –

관련 문제