2010-03-24 5 views
19

STL 할당자를 사용하는 컨테이너 클래스를 작성하려고합니다. 내가 현재 할 것은 개인 회원내 컨테이너 클래스에 std :: allocator를 사용하는 방법

std::allocator<T> alloc_; 

을 (사용자가 다른 할당을 선택할 수 있도록이 나중에 템플릿한다)가 다음 새로에 대한 포인터를 얻을 수

T* ptr = alloc_.allocate(1,0); 

를 호출하는 것입니다 할당 된 'T'객체 (그리고 생성자를 호출하는 alloc_.construct를 사용; 아래 답변 참조). 이것은 GNU C++ 라이브러리에서 작동합니다.

그러나 솔라리스에서 STLPort를 사용하면 올바른 작업을 수행하지 못하고 모든 종류의 기괴한 메모리 손상 오류가 발생합니다. 내가 대신 할 경우

std::allocator_interface<std::allocator<T> > alloc_; 

그런 다음 정상적으로 작동합니다.

stl :: allocator를 사용하는 올바른 방법은 무엇입니까? STLPort/Solaris 버전은 g ++로 컴파일하지 못했지만 g ++은 맞습니까?

+7

표준 라이브러리에는'allocator_interface'라는 것이 없습니다. – AraK

답변

8

표준 컨테이너가 위젯 할당 자와 상호 작용하는 방식을 확인하는 데 사용할 수있는 사용자 지정 allocator이 있습니다. Stephan T. Lavavej는 mallocator이라는 멋지고 간단한 것을 게시했습니다. (예 :

아니 mallocator에서 인터페이스의 모든 기능 : 다양한 STL 컨테이너를 사용하는 테스트 프로그램으로 드롭하고 당신은 쉽게 할당이 표준 컨테이너를 사용하는 방법 볼 수 있습니다 construct()destroy())에 추적 출력이 인스트루먼트되어 있으므로 표준 컨테이너가 디버거를 사용하지 않고 표준 컨테이너에서 이러한 기능을 사용하는 방법을보다 쉽게 ​​알기 위해 추적 문을 드롭 할 수 있습니다.

컨테이너가 사용자 정의 allocator을 사용하는 것으로 예상되는 방법에 대한 좋은 아이디어를 제공해야합니다.

+0

불행히도 그가 사용하지 못했던 기능인'construct'는 추적하지 않습니다 : -/ –

+0

그건 사실입니다 (제 대답에 그 단점을 언급 했었습니다). 그리고 나는 더 많은 또는 더 적은 side-bar 당신의 대답에 직접 문제를 지적하십시오. Lavavej는 사용자 정의 할당 자의 간단한 예제로 'mallocator'를 게시했습니다. 컨테이너가 할당자를 사용하는 방법에 대한 통찰력을 얻는 쉬운 방법으로 사용할 수도 있지만 그 목적을 위해 추적을 개선하기 위해 약간의 수정이 필요할 수 있다고 제안했습니다. –

16

할당자를 할당하고 구성해야합니다. 다음과 같은 것 :

T* ptr = alloc_.allocate(1,0); 
alloc_.construct(ptr, value); 

제대로 구성된 개체로 시작하지 않으면 많은 것들이 완전히 깨졌습니다. std::string이 할당되었지만 구성되지 않았다고 가정 해보십시오. 당신이 그것에 할당하려고하면, 그것은 먼저 힙과 충돌로부터의 쓰레기 값이 될 몇몇 데이터를 해제함으로써 이전 내용을 정리하려고합니다.

+0

예, 알고 있습니다. 실제로 배치했는데, std :: allocator 대신에 배치를 사용했습니다. :: construct (아마 지금은 바꿀 수 없기 때문에). 그러나 STLPort 4.x는 std :: allocator :: construct를 알지 못합니다. –

+0

STLPort에'std :: allocator :: construct'이 없으면 깨졌습니다. 그것을 사용하는 것조차 괴롭히지 마라. 나는 5.1.5 버전을 설치했음을 확신 할 수있다. –

+1

내 호기심을 만족시키기 위해 보았던 STLPort 4.x **는 적절한 표준 준수. std :: allocator를 가지고있다. 4.6에서는'stlport/stl/_alloc.h'의 365 행에'construct' 함수가 있습니다.작동하지 않으면 설치가 올바르지 않습니다. –

관련 문제