【问题标题】:Do C++ Standard Library types implement exception-safe copy-assignment?C++ 标准库类型是否实现异常安全的复制分配?
【发布时间】:2010-11-19 21:22:42
【问题描述】:

我最近开始欣赏复制和交换习语,并一直在使用它来为任何管理资源的类实现复制分配。所以这让我想到了标准库类型:标准是否保证异常安全的行为?

例如,考虑一个包含一个std::string 数据成员的类。通常,我不会实现自己的复制分配等,但这安全吗?如果复制分配失败,标准是否保证 std::string 数据成员保持不变?在这种情况下实施复制和交换是否有益 - 还是太过分了?

【问题讨论】:

  • 鉴于对于所有相关的编译器,它们被成千上万个重要程序使用,如果这些实现包含如此众所周知且可避免的缺陷,那将是非常尴尬和关键的......所以我只是假设标准库有效。
  • @delnan:我也是这么想的,然后我了解到std::deque 的 Microsoft/Dinkumware 实现是多么糟糕......

标签: c++ exception stl


【解决方案1】:

标准在 'verse' 21.4.1.2 中明确规定。 std::bad_length 以外的任何其他例外“均无效”。

【讨论】:

  • 你指的是C++03标准吗?你能提供一些上下文的整个子句吗?
【解决方案2】:

std::string 的复制分配会抛出的唯一原因是动态分配失败,在这种情况下,您(可以说)无论如何都完全搞砸了。标准库是 C++ 设计的 示例,我认为他们不会忽视这样的事情。我不会去检查标准类型的麻烦。

【讨论】:

  • 确实可以。也许我正在管理整体堆使用情况,我可以从std::bad_alloc 中恢复。我想知道我的 std::string 对象是否处于有效状态(例如,当它超出范围时它不会爆炸)。我在问标准是否需要它——你没有回答我的问题。
  • @Tabber33:即使在托管堆中,从 bad_alloc 中恢复也是一项非常重要的操作。我回答了这个问题 - 它走得太远了。
  • 我意识到这个问题很迂腐——所以我会等待能够理解为什么会被问到的人的回答。我不是在讨论处理 bad_alloc 的优点——这是问题的附带问题。
  • @Tabber33:我真的不明白。你问它是否会走远,我回答说是。
  • 不,你真的不明白。我在问标准对此事的看法。你认为它走得太远的意见得到了适当的注意。我喜欢假装那里确实需要考虑关键任务代码。这是一个有效的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2023-03-25
  • 2020-12-12
  • 2010-09-18
  • 1970-01-01
  • 2016-10-27
  • 2015-05-18
相关资源
最近更新 更多