为什么Visual Studio 2012要求我为自定义分配器提供构造/销毁?

时间:2014-03-27 10:06:16

标签: visual-studio-2012 memory-management c++11 stl allocator

由于C ++ 11提供了std::allocator_traits来简化自定义allocator的使用,因此 自定义allocator的最低要求应如下:

template <typename Tp> 
class SimpleAllocator 
{ 
    public: 
    typedef Tp value_type; 

    template <typename T> 
    struct rebind { typedef SimpleAllocator<T> other; };

    SimpleAllocator() {}

    template <typename T> SimpleAllocator(const SimpleAllocator<T>& other) {}

    Tp* allocate(std::size_t n)
    {
        // do the custom allocate here
    }
    void deallocate(Tp* p, std::size_t n)
    {
        // custom deallocate here
    }
}; 

(这是从open-std.org复制的)(我修改了一些格式)

然而,当我使用std::vector<int, SimpleAllocator<int>>编译时,使用VS2012,
编译器要我提供construct函数,
所以我被迫实施附加void construct(Tp* p, const Tp& val)
(当然还有void destroy(pointer p))。

为什么?我错过了什么?或者是因为VS2012没有提供全面支持?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的分配器版本非常好,可以与GCC一起编译。

Here,您可以找到有关最小分配器所需内容以及可以为完整分配器重新实现的内容的深层信息。似乎VS2012的std::allocator_traits有一个错误,它应该在VS2013中修复,如下所述: