【问题标题】:Can std::string::resize() throw when shrinking?std::string::resize() 缩小时可以抛出吗?
【发布时间】:2020-06-01 20:36:37
【问题描述】:

考虑以下函数:

void shrink_string(std::string& str) {
  if (str.size() >= 2) {
    str.resize(str.size() - 2);
  }
}

不知道这个函数能不能声明为noexcept(假设C++11标准)?我知道the documentation 没有将.resize() 声明为noexcept,但这主要是因为此方法可用于增长和缩小字符串。

显然,通过保持字符串容量不变并简单地减少内部长度,可以轻松实现收缩;同时resize() 可能会决定重新分配,以释放一些内存——但如果重新分配引发错误,它会退回到微不足道的调整大小吗?

【问题讨论】:

  • 还有回收空间的意图吗?那么resize 不会那样做。
  • 我认为很明显的意图是删除字符串的最后两个字符。所涉及的空间非常微不足道。

标签: c++ c++11 stdstring


【解决方案1】:

来自docs

如果容器缩小,所有迭代器、指针和对未删除元素的引用在调整大小后仍然有效,并引用它们在调用之前引用的相同元素。

因此,将矢量调整为更小的尺寸不会改变内存(使用shrink_to_fit 代替(建议a)将容量减小到大小)。这是因为操作系统中没有标准的方法来调整内存大小并强制指针相同。

HeapReAlloc() 例如,在 Windows 中,可能会或可能不会返回相同的指针,但您不能强制它返回相同的指针。

【讨论】:

  • 谢谢,但这与std::vector 有关。我想知道std::string 是否有同样的保证。
  • 内存分配策略是一样的,所以是的。
  • “未删除”是指索引小于新大小的元素,因此您的结论没有实际意义
  • 因此,虽然这表明调整大小没有原因抛出它并不能保证它不能。
猜你喜欢
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2014-04-26
  • 2018-03-22
  • 1970-01-01
  • 2019-09-10
相关资源
最近更新 更多