STL容器库 - 在allocator类的不同实例上调用allocate / deallocate是否合法?

时间:2011-07-24 07:02:36

标签: c++ stl containers allocator

首先,我认为不是。但是,我在调试模式下观察到了MSVC 10.0的这种行为。我正在使用自定义allocator类,它依赖于用户只将在同一实例上分配的指针传递给deallocate。但是,在发布模式下,我的代码正在运行。

这是一个错误还是我弄错了?

1 个答案:

答案 0 :(得分:6)

该标准要求任何分配器都能够释放由同一类型的任何其他分配器产生的内存,即使它是完全不同的实例。这是使list::splice正常工作所必需的。它在很大程度上被认为是C ++规范中的一个设计缺陷,而在C ++ 0x中,它们会向分配器引入一组修正来记住它。与此同时,您在STL容器中使用的任何分配器都不能具有自己的本地状态。

编辑:对于那些想要原始语言的人,这里是C ++ ISO规范的§20.1.5/ 4:

  

本国际标准中描述的容器的实施被允许假设他们的   除了表32中的那些之外,Allocator模板参数还满足以下两个附加要求。

     

- 给定分配器类型的所有实例都需要可互换并始终比较等于   彼此。

在C ++ 0x标准的最新ISO草案中,此要求不再存在。默认std::allocator仍然会根据需要保持此不变量,但看起来您将来不得不以这种方式限制自己。