为什么std::list要不带参数地调用我的分配器?

Why does std::list want to call my allocator with no arguments?

本文关键字:调用 我的 分配器 参数 std list 为什么      更新时间:2023-10-16

对不起,我无法粘贴具体代码。
我希望这个小样品足够了:

假设我有一个这样的分配器:

template <class T>
class MyAllocator
{
// ... typedefs
    MyAllocObject _allocObject;
public:
    MyAllocator() {
    // _allocObject = new ..
    }
    MyAllocator(const MyAllocator& alloc) {
        _allocObject = alloc.getAllocObject();
    }
    template <class U>
    MyAllocator(const MyAllocator<U>& alloc) {
        _allocObject = alloc.getAllocObject();
    }
    MyAllocator(const MyAllocObject& allocObject) {
        _allocObject = allocObject;
    }
    inline pointer allocate(size_type size) {
        return _allocObject->alloc(size);
    }
// other functions
};

And的用法如下:

MyAllocObject object;
MyAllocator<int> myAlloc(object);
std::list<int, MyAllocator<int> > list(myAlloc);

我经历过,如果缺少默认构造函数,代码就无法编译,所以我添加了它。
但问题是,我依赖于那个参数,因为那是我用来定制内存分配的。

在这种情况下我能做什么?

在c++ 11之前,允许STL实现要求分配器表现得好像无状态的。

"表现得好像是无状态的"意味着STL可以依赖以下操作来工作:

MyAllocator a1;
void * p = a1.allocate(77, 0);
MyAllocator a2;
a2.free(p);

(IIRC这简化了一些容器操作的实现)

"were allowed to require"意味着STL实现可以支持有状态分配器(像你的),但不是必须的。


c++ 11要求支持有状态分配器。
然而,我找不到一个简短的介绍(有人想补充吗?)这个帖子可能会给你一些线索。


如果绑定到不支持有状态分配器的特定编译器,则有一些不太显眼的选项:

  • 包含对你的状态的引用,作为分配器的模板参数
  • 在您的分配中,包含一个指向相关分配器的反向链接(通常会破坏用于小数据的自定义分配器的目的)