gpt4 book ai didi

c++ - 为什么 std::list 想不带参数调用我的分配器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:32 26 4
gpt4 key购买 nike

抱歉,我不能贴出具体的代码。
我希望这个小样本就足够了:

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

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
};

像这样使用:

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 需要支持有状态分配器。
但是,我找不到对此的快速介绍(有人想补充吗?)This thread might give you some leads .


如果您绑定(bind)到不支持有状态分配器的特定编译器,您有一些不太好的选择:

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

关于c++ - 为什么 std::list 想不带参数调用我的分配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33368325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com