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

STL container library - Is it legal to call allocate/deallocate on different instances of the allocator class?

本文关键字:allocate 调用 deallocate 是否 实例 allocator STL      更新时间:2023-10-16

首先,我不这么认为。但是,我在调试模式下的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仍然会根据需要维护这个不变量,但是看起来您将来不必这样约束自己。