STL容器库-在allocator类的不同实例上调用allocate/deallocate是否合法?
STL container library - Is it legal to call allocate/deallocate on different instances of the allocator class?
首先,我不这么认为。但是,我在调试模式下的MSVC 10.0中观察到这样的行为。我使用一个自定义的allocator
类,它依赖于用户只传递在同一实例上分配给deallocate
的指针。但是,在发布模式下,我的代码可以正常工作。
这是一个bug还是我错了?
标准要求任何分配器都能够释放由任何其他相同类型的分配器产生的内存,即使它是一个完全不同的实例。这是获得list::splice
正常工作所必需的。这在很大程度上被认为是c++规范中的一个设计缺陷,在c++ 0x中,他们为分配器引入了一组修复程序来记住这一点。同时,在STL容器中使用的任何分配器都不能有自己的本地状态。
EDIT:对于那些想要原始语言的人,这里是c++ ISO规范的§20.1.5/4:
允许本国际标准中描述的容器的实现假定其除表32中的要求外,Allocator模板参数还满足以下两个额外要求。
-给定分配器类型的所有实例必须是可互换的并且总是比较等于对方。
在最新的ISO c++ 0x标准草案中,此要求不再存在。默认的std::allocator
仍然会根据需要维护这个不变量,但是看起来您将来不必这样约束自己。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- 是否保证std::vector每次使用allocate函数分配的内存,也会通过单个deallocate调用立即释放?
- STL容器库-在allocator类的不同实例上调用allocate/deallocate是否合法?