为什么 std::list 想不带参数调用我的分配器?
Why does std::list want to call my allocator with no arguments?
抱歉,我无法粘贴具体代码。
我希望这个小样本足够了:
假设我有一个这样的分配器:
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 实现要求分配器表现得好像是无状态的。
"behave as-if stateless" 表示 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.
如果您绑定到不支持有状态分配器的特定编译器,您有一些不太好的选择:
- 包括对您的状态的引用作为分配器的模板参数
- 在你的分配中,包括一个 back-link 到有问题的分配器(通常破坏小数据的自定义分配器的目的)
抱歉,我无法粘贴具体代码。
我希望这个小样本足够了:
假设我有一个这样的分配器:
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 实现要求分配器表现得好像是无状态的。
"behave as-if stateless" 表示 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.
如果您绑定到不支持有状态分配器的特定编译器,您有一些不太好的选择:
- 包括对您的状态的引用作为分配器的模板参数
- 在你的分配中,包括一个 back-link 到有问题的分配器(通常破坏小数据的自定义分配器的目的)