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

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

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

解决方法:

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

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

Implementations of containers described in this International Standard are permitted to assume that their
Allocator template parameter meets the following two additional requirements beyond those in Table 32.

— All instances of a given allocator type are required to be interchangeable and always compare equal to
each other.

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

上一篇:Python三大web框架简单介绍


下一篇:java – 删除容器中的项目