调用分配器.构造基元

C++ Calling allocator.construct for Primitives

本文关键字:分配器 调用      更新时间:2023-10-16

对于使用任意分配器分配的基本类型数组,是否有必要调用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_); }
};

是。分配器可以自由地强加它想要的任何自定义记录,包括现有对象的数量。不能保证它只做new (memory) T(...)。此外,这将是一个非常令人讨厌的惊喜的人改变你的代码,使它不再只是原语,然后发现它随机中断的某个时候。