Вызов C ++ allocator.construct для примитивов - PullRequest
3 голосов
/ 03 января 2012

Необходимо ли мне вызывать allocator.construct () для массива примитивных типов, выделенных с использованием произвольного распределителя, как в листинге кода ниже? Класс не требует, чтобы выделенная память была инициализирована каким-либо конкретным значением, поэтому мне кажется, что вызов 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_); }
};

1 Ответ

3 голосов
/ 03 января 2012

Да.Распределитель может навязывать любой пользовательский учет, который он хочет, включая количество существующих объектов.Нет никакой гарантии, что он просто делает new (memory) T(...).И, кроме того, для человека было бы очень неприятным сюрпризом изменить ваш код, чтобы он больше не был просто примитивом, а потом обнаруживал, что он случайно ломается через некоторое время.

...