【问题标题】:Does vector resize throwing bad_alloc invalidate the original data?向量调整大小抛出 bad_alloc 会使原始数据无效吗?
【发布时间】:2023-04-04 17:14:05
【问题描述】:

std::vector::resize() 抛出std::bad_alloc 异常后,std::vector 对象中的原始数据是否仍然有效且可访问?

答案是否适用于其他分配器,例如如果boost::interprocess::allocator被用作分配器,boost::interprocess::bad_alloc被抛出?

【问题讨论】:

  • 根据cppreference如果抛出异常,这个函数没有任何作用(强异常保证)。(我让别人带一份标准回答问题)
  • 我现在看到了一个可能的重复项(尽管答案措辞特定于 push_backpush_front):stackoverflow.com/questions/8899814/…

标签: c++ vector stl containers boost-interprocess


【解决方案1】:

std::vector::resize 是异常安全的。

如果抛出异常,此函数无效(强异常保证)。

Link to the exception specification. 规范没有提到对分配器的任何特殊要求,无论您提供什么分配器都必须满足。

【讨论】:

    【解决方案2】:

    std::vector 对象中的原始数据是否仍然有效且可访问?

    是的,std::vector::resize 有很强的异常保证(下面提到的情况除外)。 §26.3.11.3/15 vector capacity [vector.capacity]:

    如果非 CopyInsertable T 的移动构造函数引发异常,则没有任何影响。

    保证与指定什么样的分配器无关;所以它总是正确的。

    【讨论】:

      猜你喜欢
      • 2010-12-10
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2015-02-27
      相关资源
      最近更新 更多