Dir*_*eld 12 c++ stl allocation
我正在尝试编写一个派生自定义的STL分配器std::allocator,但不知何故所有调用都要allocate()转到基类.我把它缩小到这段代码:
template <typename T> class a : public std::allocator<T> {
public:
T* allocate(size_t n, const void* hint = 0) const {
cout << "yo!";
return 0;
}
};
int main()
{
vector<int, a<int>> v(1000, 42);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期待"哟!" 打印,然后是一些可怕的错误,因为我实际上没有分配任何东西.相反,该程序运行良好,并没有打印.我究竟做错了什么?
我在gcc和VS2008中得到了相同的结果.
您需要提供重新绑定成员模板以及C++标准中分配器要求中列出的其他内容.例如,您需要一个模板复制构造函数,它不仅可以接受allocator<T>,还可以接受allocator<U>.例如,一个代码可能会执行,例如std :: list可能会执行此操作
template<typename Allocator>
void alloc1chunk(Allocator const& alloc) {
typename Allocator::template rebind<
wrapper<typename Allocator::value_type>
>::other ot(alloc);
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果没有正确的重新绑定模板,或者没有相应的复制构造函数,代码将失败.猜测要求是什么,你将无处可用.迟早你将不得不处理依赖于那些分配器要求的一部分的代码,并且代码将因为你的分配器违反它们而失败.我建议你在一些工作草案中看一下你的标准副本20.1.5.
在这种情况下,问题是我没有覆盖分配器的重新绑定成员。此版本有效(在 VS2008 中):
template <typename T> class a : public std::allocator<T> {
public:
T* allocate(size_t n, const void* hint = 0) const {
cout << "yo!";
return 0;
}
template <typename U> struct rebind
{
typedef a<U> other;
};
};
int main() {
vector<int, a<int>> v(1000, 42);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我通过调试 STL 头文件发现了这一点。
这是否有效将完全取决于 STL 实现,所以我认为最终,Klaim 是正确的,因为这不应该这样做。
| 归档时间: |
|
| 查看次数: |
6746 次 |
| 最近记录: |