我刚刚完成了一个关于重写new和delete运算符的个人项目,并且开始学习此过程中的分配器类。阅读了包括cppreference.com在内的几个在线引用资料后,我注意到许多功能被描述为可选功能。

我的问题是分配器接收者如何std::set,如果其接收到的分配器仅可选地实现函数和类型,则可以工作吗?

我会理解,是否需要分配器从某个具有所有功能默认实现的基类派生,但是似乎没有分配器的继承要求。

还是因为编译错误而使人警觉到需要实现这些可选功能?

作为引用,这是我第一次尝试使用分配器,该分配器用作std::set的第三个模板参数。我处理了一个现有示例,因此我相信我实现的大部分内容可能都是不必要的,但是我还不了解如果将来选择与其他STL容器一起使用分配器,那么如何判断是必要的。除非再次期望是根据编译错误来解决...?

template <typename T>
class Allocator // Custom allocator for use by AllocSet::mAllocatedPtrs to avoid infinite recursion
{               // (because inserting an element in std::set calls ::operator new, which is overridden to add to AllocSet::mAllocatedPtrs).
    public:
        typedef T value_type;
        typedef T* pointer;
        typedef T& reference;
        typedef const T* const_pointer;
        typedef const T& const_reference;
        typedef size_t size_type;
        typedef ptrdiff_t difference_type;

        template <typename U>
        struct rebind { typedef Allocator<U> other; };

        Allocator() { }
        template <typename U> Allocator(const Allocator<U>&) { }
        virtual ~Allocator() { }

        pointer allocate(size_t numT) { return (T*)(malloc(numT * sizeof(T))); }
        void deallocate(pointer p, size_type st) { free(p); }

        size_type max_size() { return size_type(-1); }

        reference operator=(const_reference) { return *this; }
        template <typename U> reference operator=(const Allocator<U>&) { return *this; }
        template <typename U> bool operator==(const Allocator<U>&) { return true; }
        template <typename U> bool operator!=(const Allocator<U>&) { return false; }

        pointer address(reference r) { return &r; }
        const_pointer address(const_reference r) { return &r; }
};

最佳答案



如果您查看the allocator concecpt:



这也是为什么这么多东西是可选的-大多数分配器实现确实不需要更改它们的原因,那么为什么要打扰呢?假设您有一个新的内存重组算法的想法,为什么您需要定义pointer



不,分配器的概念是well defined。它指定了您必须提供的内容以及可以提供的内容。无需依赖编译错误。

您可以在the standard,$ 17.6.3.5中找到要求。

关于c++ - 为什么许多分配器功能是可选的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39405014/

10-12 20:50