关于C++标准Allocator与AllocatorAwareContainer的construct函数及异常保证疑问
关于allocator感知型
std::vector中allocator的假设问题 在实现allocator感知型容器时,虽然标准未明确定义allocator的construct函数语义,但可基于标准的分配器要求和容器异常安全的隐含契约,做出以下关键假设:
分配器兼容性假设
用容器的allocator调用construct构造/移动的对象,必须能被该allocator正确管理:- 若对象是allocator-aware类型,其内部持有的allocator需与容器allocator兼容(满足
std::allocator_traits<Alloc>::is_always_equal或可交换); - 构造后的对象必须能用该allocator的
destroy函数正确销毁,不会出现资源泄漏或未定义行为。
- 若对象是allocator-aware类型,其内部持有的allocator需与容器allocator兼容(满足
强异常保证下的行为约束
针对需要强异常保证的容器操作(如push_back、insert),可假设:- 自定义
construct在移动allocator-aware对象时,不会修改源对象的allocator状态——否则异常回滚时,源对象的状态已被破坏,容器无法恢复到操作前的状态; - 若
construct必须调整目标对象的allocator,该调整操作必须是无异常的,且调整后的allocator需符合容器allocator的传播特性(如propagate_on_container_move_assignment),确保回滚时的移动赋值/构造操作不会抛出异常。
- 自定义
标准契约的兜底规则
任何违反上述隐含要求的allocator实现,属于违反标准分配器契约,容器无需为这类情况保证异常安全性。容器只需遵循标准定义的行为逻辑,因自定义allocator违规导致的问题,责任由allocator实现方承担。
内容的提问来源于stack exchange,提问作者John H. Kohler
相关产品推荐
相关产品推荐

