是否有可能调用std::vector<T>::clear()
来抛出异常?
答案 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中,vector
有erase
的例外(因为它可能需要复制或移动某些元素),但不包含其他元素。
如果元素析构函数在clear()
期间抛出,则会产生std::unexpected()
。
答案 2 :(得分:5)
是的,如果T
的析构函数抛出,否则抛弃。
更新的 好像我错了;它只是在那种情况下崩溃
答案 3 :(得分:-2)
是和否
是:
clear
最终调用delete[]
运算符,其中包括调用数组的所有对象的析构函数(如果有的话)和free
内存。
析构函数最终可能会抛出异常。
在异常情况下(例如堆损坏等),内存释放也可能会失败
没有
抛出异常是破坏者被批评并且大部分都不会发生(至少在标准库中)。除了在堆栈展开期间从析构函数抛出的异常(由另一个异常引起)可能无法处理的事实之外,析构函数中存在异常的逻辑问题。
释放内存时出错通常是由堆损坏或其他无法恢复的问题引起的。无论如何,无论是否存在异常
,程序的命运都将会消亡