2009-03-17 2 views
7

프로젝트의 경우, STL 컨테이너를 처음부터 작성하고 있습니다 (이유가 있습니다). STL의 기능과 인터페이스를 너무 가깝게 흉내 내고 있기 때문에 "표준 구조와 이름이 같은 경우 가능한 한 표준을 준수 할 것"이라는 정책을 유지하기 위해 최선을 다하고 있습니다.std :: allocator 구조체/파괴 대 배치식 new/p-> ~ T()

물론 컨테이너는 할당자를 템플릿 매개 변수로 사용합니다.이 매개 변수는 일부 사용자 지정 할당 스키마를 허용하므로 매우 좋습니다. 내 질문에.

std::allocator 인터페이스는 객체 할당과 메모리 할당을 구분합니다. 마찬가지로 그것은 할당 해제와 파기를 구분합니다. 이것은 메모리를 얻는 곳이 C++로 객체를 적절히 구성하는 것과 관련이 없기 때문에 의미가 있습니다. 단순히 새로운 배치를 호출

void construct(pointer p, const T& val) { new(p) T(val); } 
void destroy(pointer p)     { p->~T(); } 

당신이 구축 볼 수 있듯이 단순히 소멸자를 호출 파괴 :

그래서 거기에 (책에서 바로 해제) 기본 구현을 위해 다음과 같이 두 건설/해제 기능입니다 .

배치 (placement) 신택스와 소멸자 (destructor) 신택스를 사용하는 이유가 있습니까? "올바른"할당자가 다른 방식으로이를 구현할 수 있습니까? 아니면 표준에 부합하는 모든 할당 자 구현이이 방법으로 구현 된 메소드를 구축/파괴 할 것이라고 보장합니까?

요점은 내 용기의 구성 요소를 구성 할 때 항상 std::uninitialized_copystd::uninitialized_fill을 사용할 수 있다고 말하는 것이 안전합니까?

감사합니다.

답변

8

할당자는 로깅 문을 생성/삭제 또는 그 밖의 부작용을 추가 할 수 있습니다. 물론

실제 건설은 새로운 배치와 소멸자를 호출하여 발생하는이 있지만, 나는 동의 할 수 밖에아무것도/기능을

+1

예, 좋은 지적입니다. "post-allocation/pre-construction"로깅이나 memleak 추적을위한 좋은 고리가 될 수 있습니다. –

+1

이 답변은 맞지만 조금 오해의 소지가 있습니다. 로깅과 같은 부작용은 실제로 정확한 예외 안전성과 관련하여 매우 까다로운 작업입니다. 맞춤 설정은 삽입 된 새 표현식 (예 : 생성자 인수. https://groups.google.com/a/isocpp.org/d/topic/std-discussion/yZLnYy_y2z0/discussion을 참조하십시오. – Potatoswatter

2

이는 메소드의 할당 세부 사항을 숨기는 것입니다. 즉, 우리는 건설 및 파괴를위한 API를 제공하고 있으며, 향후 구현을 변경할 수 있습니다. 이제 우리는 메모리를 할당하기 위해 새로운 배치를 사용하고 있습니다. 할당을 변경하려면 앞으로이 두 가지 메소드를 변경해야합니다.

+0

참으로 파괴 구조물에 발생하지해야한다는 규정집에 말하지 않는다 그것으로. 그러나 표준에 따라 변경이 가능한지 궁금합니다. (특히 우리는 새로운 표준을 기다릴 필요가없는 사용자 정의 할당자를 사용합니다 ...). –

+0

'allocator :: construct'는 할당과 관계가 없으며, 모든 할당자는 (지금) 할당되어 있기 때문에, 왜 그들이 구조를 만들지를 상상할 수 없습니다. –

관련 문제