프로젝트의 경우, 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_copy
과 std::uninitialized_fill
을 사용할 수 있다고 말하는 것이 안전합니까?
감사합니다.
예, 좋은 지적입니다. "post-allocation/pre-construction"로깅이나 memleak 추적을위한 좋은 고리가 될 수 있습니다. –
이 답변은 맞지만 조금 오해의 소지가 있습니다. 로깅과 같은 부작용은 실제로 정확한 예외 안전성과 관련하여 매우 까다로운 작업입니다. 맞춤 설정은 삽입 된 새 표현식 (예 : 생성자 인수. https://groups.google.com/a/isocpp.org/d/topic/std-discussion/yZLnYy_y2z0/discussion을 참조하십시오. – Potatoswatter