首页 > 试题广场 >

关于C++的异常处理,下列说法正确的有

[不定项选择题]
关于C++的异常处理,下列说法正确的有
  • 异常匹配的规则是寻找第一个与异常对象动态类型匹配的catch语句,而非寻找最佳匹配的catch语句
  • 由于在构造函数中抛出其自身不能捕获的异常会造成对象不完全构造,因而会造成内存泄漏
  • catch子句中的异常声明既可以是左值引用,也可以是右值引用
  • 若在析构函数中抛出其自身不能捕获的异常,则会直接调用std::terminate终止程序

我是贡献人,欢迎大家参与本题讨论。
参考答案:A
解析:

  • B项,在构造函数中抛出其自身不能捕获的异常会造成对象不完全构造,因而析构函数将不会被调用。对于在栈上的局部变量会在在栈展开(stack unwinding)过程中被自动销毁,但是堆上的变量则不会。因而在这种情况下,是有可能造成内存泄漏(而不是一定会内存泄漏),错误。
  • C项,异常声明类型可以是左值引用,但不能是右值引用,错误。
  • D项,根据C++标准草案n468718.4(5) Whenever an exception is thrown and the search for a handler (18.3) encounters the outermost block of a function with a non-throwing exception specification, the function std::terminate() is called (18.5.1).(8) The exception specification for an implicitly-declared destructor, or a destructor without a noexcept-specifier , is potentially-throwing if and only if any of the destructors for any of its potentially constructed subobjects is potentially throwing.可知,若类的子对象的析构函数并非可能抛出异常且该类的析构函数为隐式声明或未显式声明异常规范的,则该类的析构函数视为隐含noexcept(true)的。声明为noexcept(true)的函数若未在函数体内捕获到抛出的异常会直接调用std::terminate。相反,若析构函数有显式声明noexcept(false)等其他情况,异常是可以逃离析构函数体的。D错误。
发表于 2018-02-27 15:52:47 回复(0)
让去
发表于 2018-02-14 18:29:27 回复(0)
acd
发表于 2018-02-13 17:35:56 回复(0)