可以矢量<t> :: clear throw?</t>

时间:2011-11-09 13:50:45

标签: c++ exception vector

是否有可能调用std::vector<T>::clear()来抛出异常?

4 个答案:

答案 0 :(得分:22)

  

[2003: 21.2.1/11 | n3290: 21.2.1/10]:除非另有说明   (见23.2.4.1,23.2.5.1,23.3.3.4和23.3.6.5)所有容器类型   本条款中定义的内容符合以下附加要求:   [..] - erase()clear()pop_back()pop_front()   函数抛出异常。 [..]


如果我的元素类型析构函数抛出会发生什么?

在C ++ 11中,std::vector<T>::clear()被标记为noexcept[n3290: 23.3.6/1])。

实现可能会捕获~T以外的任何异常,因此clear()本身可能不会抛出任何异常。如果他们没有,而且确实如此,则例外情况是“意外的”#34;并终止过程而不是传播:

struct T {
   ~T() { throw "lol"; }
};

int main() {
   try {
      vector<T> v{T()};
      v.clear();
   }
   catch (...) {
      cout << "caught";
   }
}

// Output: "terminated by exception: lol" (GCC 4.7.0 20111108)
  

[n3290: 15.5.1]:在某些情况下,必须进行异常处理   放弃了不那么微妙的错误处理技术。 [..] - 当。。。的时候   搜索处理程序(15.3)遇到a的最外面的块   使用 no-except-specification 的函数不允许使用   例外(15.4)[..]

答案 1 :(得分:7)

没有

编辑:哎呀,不小心使用了N3126。下面的一些标准部分编号不好。

23.2.1p11:

  

除非另有规定(见23.2.4.1,23.2.5.1,23.3.2.3和23.4.1.4),本条款中定义的所有容器类型均符合以下附加要求:...

  • 没有erase()clear()pop_back()pop_front()函数会抛出异常。

在23.4.1.4中,vectorerase的例外(因为它可能需要复制或移动某些元素),但不包含其他元素。

如果元素析构函数在clear()期间抛出,则会产生std::unexpected()

答案 2 :(得分:5)

是的,如果T的析构函数抛出,否则抛弃。

更新的 好像我错了;它只是在那种情况下崩溃

答案 3 :(得分:-2)

是和否

是:

clear最终调用delete[]运算符,其中包括调用数组的所有对象的析构函数(如果有的话)和free内存。

析构函数最终可能会抛出异常。

在异常情况下(例如堆损坏等),内存释放也可能会失败

没有

抛出异常是破坏者被批评并且大部分都不会发生(至少在标准库中)。除了在堆栈展开期间从析构函数抛出的异常(由另一个异常引起)可能无法处理的事实之外,析构函数中存在异常的逻辑问题。

释放内存时出错通常是由堆损坏或其他无法恢复的问题引起的。无论如何,无论是否存在异常

,程序的命运都将会消亡