3

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

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

4

1 回答 1

6

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

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

本国际标准中描述的容器的实现允许假设其分配器模板参数满足表 32 中的以下两个附加要求。

— 给定分配器类型的所有实例都必须是可互换的,并且总是相互比较相等。

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

于 2011-07-24T07:05:46.963 回答