为什么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
};
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要求支持有状态分配器。
然而,我找不到一个简短的介绍(有人想补充吗?)这个帖子可能会给你一些线索。
如果绑定到不支持有状态分配器的特定编译器,则有一些不太显眼的选项:
- 包含对你的状态的引用,作为分配器的模板参数
- 在您的分配中,包含一个指向相关分配器的反向链接(通常会破坏用于小数据的自定义分配器的目的)
相关文章:
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 什么时候可以使用常量装饰调用我的重载函数?
- 为什么当我做复制和交换习语时不调用我的复制构造函数?
- 钩/绕道 d3d9 (现在/结束场景) - 似乎调用我的函数然后崩溃
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在linux中,mono调用我的.so-lib返回System.EntryPointNotFoundException
- 当我从头文件和实现文件调用我的函数到我的主文件时,我没有得到任何输出
- 为什么没有调用我的回调?
- 如何制作指针来调用我的成员函数
- 如何在Android Studio中编写CMakelists来调用我的C 项目(JNI)的功能
- 为什么在这种情况下不调用我的移动构造函数?(首先分配 r 值引用并创建对象)
- 我如何调用我的3个数据成员中每个人的设置方法,然后显示由我的设置方法设置的值
- 为什么没有调用我的覆盖方法
- 我的类中有方法的指针数组,但我不能调用我的方法.代码如下
- C++模板:无法从 main.cpp 调用我的函数
- 为什么我继承的构造函数调用我的基本默认构造函数
- 我如何在C#GUI中调用我的C 程序
- SetWindowsHookEx没有调用我的回调
- c++ Glut 显示需要调用我的绘制函数,但我无法传递任何参数
- 如何从对象中调用我的set回调函数