C++ 2003에서는 할당 기 모델이 손상되어 실제로 적절한 해결책이 없습니다. C++ 2011의 경우 할당 자 모델은 고정되어 있으며 포함 된 객체로 전파되는 인스턴스 할당 자당 가질 수 있습니다 (물론 대체하지 않는 경우 제외). 일반적으로 이것이 유용하기 위해서는 아마도 기본값 인 std::allocator<T>
이 필요하지 않은 동적 인 다형성 할당 자 유형을 사용하고 싶을 것입니다 (그리고 더 나은 구현 선택 일지 모르지만 일반적으로 동적 인 다형성이 아닐 것으로 기대합니다). 그러나 메모리 할당을 수행하는 표준 C++ 라이브러리의 모든 클래스는 템플릿 인수로 할당 자 유형을 취하는 템플릿입니다 (예 : IOStream은 예외이지만 일반적으로 할당 자 지원 추가를 보증하기 위해 메모리 양은 할당하지 않습니다)).
귀하의 의견에 따라 할당자가 효과적으로 글로벌해야 할 것이라고 주장하고 있습니다. 그것은 정확하지 않습니다. 각 할당 자 인식 형은 주어진 할당 자의 복사본을 저장합니다 (적어도 인스턴스 수준의 데이터를 가지고있는 경우, 그렇지 않은 경우에는 operator new()
및 operator delete()
을 사용하는 기본 할당자가있는 것처럼 저장하지 않습니다) . 이것은 객체를 사용하는 액티브 할당자가있는 한 객체에 주어진 할당 메카니즘을 고수해야 함을 의미한다. 이 은 일 수 있지만 전역 개체를 사용하여 수행 할 수 있습니다. 참조 카운팅 또는 할당자를 주어진 모든 객체를 포함하는 객체와 연관시키는 것. 예를 들어, XML, Excel, Pages, 어떤 구조 파일이라도 생각하는 각 "문서"가 할당자를 구성원에게 전달하면 할당자는 문서의 구성원으로 살며 문서가 파괴 된 후 문서가 파괴되면 파괴 될 수 있습니다 . 할당 자 모델의이 부분은 할당 자 인수를 취하는 한 pre-C++ 2011 클래스에서도 작동해야합니다. 그러나 사전 C++ 2011 클래스에서 할당자는 포함 된 객체로 전달되지 않습니다. 예를 들어, 할당자를 std::vector<std::string>
으로 지정하면 C++ 2011 버전은 에 할당 된 할당자를 사용하여 std::string
을 적절하게 처리하여 std::string
을 생성합니다.이것은 C++ 2011 이전 할당 자에게는 발생하지 않습니다.
실제로 서브 시스템에서 할당자를 사용하려면 함수 및/또는 클래스에 대한 인수로 명시 적으로 전달하거나 컨텍스트로 사용되는 할당 자 인식 객체를 통해 암시 적으로 전달해야합니다. 예를 들어 표준 컨테이너 중 하나를 컨텍스트로 전달하는 경우 [get_allocator()
] 메서드를 사용하여 사용 된 할당자를 얻을 수 있습니다.
왜 할당자가 전역 적이어야합니까? 할당 된 각 유닛이 자신의 할당 자에 대한 참조를 가지고있어 올바르게 해제 될 수 있다면, 할당 자의 실제 위치는 중요합니까? –
할당자는 어디에서 할당 된 단위를 떠나겠습니까? 그것은 마치 세계화 되어야만하는 것처럼 보일 것입니다. – chadb