我认为这听起来是一个简单的问题,但我在阅读C++异常规范时提出了这个问题。也就是说,在其中一本书中,C++11现在有一个关键字‘no以外’,这意味着当函数头声明它时,它不会被抛出异常,并且这个关键字出现的原因是C++ exception specifications are checked at run time rather than at compile time, so they offer no programmer guarantees that all exceptions have been handled.,因此他们得出了两种情况,一个函数会抛出异常,或者如果我们清楚它是否永远不会抛出,那么就使用noexcept进行优化(希望如此)。
void foo() noexcept();
这是主要的问题。哪个系统软件执行这些运行时检查(我希望不是编译器/链接器/加载程序),以及在运行时哪个系统软件负责分配内存(动态内存分配),而编译器和其他软件都没有注意到这一点?
发布于 2016-02-05 05:16:02
实际上,您不会说“标准库”处理这个问题。异常和异常规范是一个核心语言特性,比标准库更基本。
您也可以问,有什么软件可以确保当我在C++中调用函数时,调用方实际上收到了我传入的值?在我的程序运行时,哪个软件处理堆栈帧指针?
从标准的角度来看,我认为“实施”是负责这些细节的。例如,在一些语言中,比如Java,有一个"Java运行时环境“(),它非常清楚地负责这些事情,您可以尝试研究它是如何做到的。在C++中没有通用的运行时环境--就像其他人说的那样,编译器负责生成确保这些事情发生的代码,并且代码最终会分散在结果的可执行文件中。编译器到底是如何完成其任务的是特定于实现的,您不能给出超出标准规定的一般答案,而且通常它会指定预期的行为,而不是隐藏的细节。
当你问
另外,哪个系统软件负责在运行时分配内存(动态内存分配)
这也是一个实现细节,它将因编译器而异。
发布于 2016-02-04 21:17:35
没有主动的“系统软件”检查异常,正如您所说的那样;相反,抛出异常是程序本身所采取的操作。程序将异常传回堆栈,直到异常与异常处理程序匹配为止。
如果没有异常处理程序匹配,则由引导代码捕获异常(main不是典型程序的实际入口点,而是运行时将控制交给程序员的位置),程序终止。
发布于 2016-02-04 18:53:08
这是由C++运行时(例如libstdc++)完成的。在出现异常的情况下,编译器在函数周围添加了一些保护(如果抛出异常,这无论如何都是调用析构函数所必需的),如果函数抛出(或者抛出抛出的规范之外的其他异常),则由C++运行时调用终止(),并关闭应用程序。
内存堆分配也(默认情况下)由C++运行时库完成。
https://stackoverflow.com/questions/35209091
复制相似问题