2012-01-02 2 views
3

아래의 코드에서와 같이 임의 할당자를 사용하여 할당 한 기본 유형의 배열에 대해 allocator.construct()를 호출해야합니까? 이 클래스는 할당 된 메모리를 특정 값으로 초기화 할 필요가 없으므로 새로 할당 된 메모리 덩어리로 allocator.construct()를 호출하면 불필요한 것으로 보인다. 배열이 항상 원시 형으로 구성되어 있기 때문에이 메서드를 호출하지 않을 위험이 있습니까?C++ Primitive를위한 allocator.construct 호출하기

template <class T, template <class> class Allocator = std::allocator> 
class foo 
{ 
public: 
    typedef Allocator<T> allocator; 
    typedef typename allocator::pointer pointer; 
private: 
    unsigned size_; 
    allocator alloc_; 
    pointer t_; 
public: 
    foo(unsigned n) throw(std::bad_alloc) : size_(n), alloc_(), 
    t_(alloc_.allocate(n)) 
    { 
     // Note that I do not call alloc_.construct() here. 
    } 

    ~foo() { alloc_.deallocate(t_, size_); } 
}; 
+0

코드를 설명하는 대신 간단한 코드를 게시하는 것이 더 쉽습니다. –

+0

코드 샘플을 내 게시물에 추가했습니다. –

답변

3

예. 할당자는 기존 객체의 수를 포함하여 사용자가 원하는대로 장부 보관을 자유롭게 할 수 있습니다. 단순히 new (memory) T(...)을한다는 보장은 없습니다. 또한 코드를 변경하여 더 이상 기본 요소가 아니며 언젠가 나중에 무작위로 중단된다는 사실을 매우 불쾌한 놀라움으로 표현할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 난 몰랐어. –

+0

또한 allocate()를 사용하여 메모리를 할당 한 다음 uninitialized_copy()를 사용하여 초기화하는 것이 안전합니까? –

+0

궁금한 사람들에게이 링크는 내 질문에 대한 답변이라고 생각합니다. http://stackoverflow.com/questions/6047840/does-an-allocator-construct-loop-equal-stduninitialized-copy uninitialized_copy를 사용하여 allocator.allocate()에 의해 반환 된 메모리를 초기화하는 것이 안전합니다. –