2016-07-25 5 views
4

할당 자에 대한 몇 가지 개념에 대해 잘못 이해했을 수 있습니다. 하지만 실제로 할당 할 객체의 수를 나타 내기 위해 allocate으로 전달되는 std::size_t의 인수가 필요한 이유를 모르겠습니다. 인수가 배열이나 벡터 같은 메모리 영역을 할당하는 데 사용됩니까?포인터가 배열을 가리키는 지 어떻게 알 수 있습니까?

만약 내가이라면 이전에 반환 된 포인터가 영역이나 객체만을 가리키는 지 어떻게 알 수 있습니까? 내 할당자가 이러한 포인터를 기록 할 책임이 있습니까?

이 아닌 경우 그 인수가 필요한 이유는 무엇입니까?

+0

http://en.cppreference.com/w/cpp/memory/allocator/allocate – NathanOliver

답변

5

allocator_traits<YourAllocator<T>>::allocateT 유형의 N 개체로 이루어진 연속 된 시퀀스에 대해 메모리를 할당 할 것으로 예상됩니다. N은 size_t 매개 변수에 의해 제공됩니다.

그렇다면 내 사용자 정의 할당자는 이전에 반환 된 포인터가 영역 또는 객체를 가리키는 지 어떻게 알 수 있습니까?

"이전에 반환 된 포인터"는 무엇입니까?

할당자가 할당시기와시기는 일 때 메모리 할당을 해제합니다. 할당 해제가 발생하면 it will be told what N was for the allocation that is being deallocated. 할당자는 포인터를 추적 할 필요가 없습니다.

+0

내 나쁜, 그리고 그 때문에 STL 컨테이너에 전달하면 끔찍한 메모리 누수가 발생했습니다. 'void deallocate (pointer ptr, std :: size_t dummy = 1)'로 서명을 썼습니다. : - \ Thanks – YiFei

0

std :: allocator에 대한 이야기입니다. 문서는 매우 분명하다

T* std::allocator::allocate(std::size_t n);

를 할당 n 개의 *의를 sizeof (T) 초기화되지 않은 스토리지의 바이트는 [...]

그래서 귀하의 질문에 대한 답은 다음과 같습니다 예, 인수는 배열 또는 벡터와 같은 메모리 영역을 할당하는 데 사용됩니다.

그리고 당신의 후속 질문에 대한

는 : std::allocator::deallocate이 반환 된 포인터 중 어떤 것과 동일한 n std::allocator::allocate로 호출이 보장되기 때문에 아니, 당신은, 반환 된 포인터를 추적 할 필요가 없습니다. void std::allocator::deallocate(T* p, std::size_t n);

포인터가 할당 이전 호출에 의해 수득되어야하는 포인터 (P)에 의해 참조 된 저장 장치를 해제한다(). 인수 n은 원래 p를 생성 한 allocate() 호출의 첫 번째 인수와 같아야합니다. 그렇지 않으면 동작이 정의되지 않습니다.

+0

여기에는 아무런 보증이 없습니다. 할당과 함께 생성 된 동일한 포인터를 전달해야하며 올바른 크기를 전달해야합니다. 그렇지 않으면 UB입니다. – NathanOliver

+0

@NathanOliver 표준 컨테이너가 제공하는 보증을 참조하고 있다고 생각합니다 :'std :: vector'에 대한 커스텀 할당자를 생성한다면,'std :: vector'는 항상 (이론적으로) 할당 자의 계약을 존중할 것입니다 'allocate'에서 사용 된 것과 같은'p'와'n'을 사용하여'deallocate'를 호출합니다. – KABoissonneault

+0

@KABoissonneault Ah. 그건 의미가 있습니다. – NathanOliver

관련 문제