根据LLVM Coding Standards,“LLVM不使用[...]例外”。但是,LLVM确实使用了C ++的标准容器,例如px
。
LLVM如何在没有例外的情况下使用标准容器?它如何处理容器通常std::vector
的情况?例如,如果throw
无法分配内存且无法std::vector::push_back
?
答案 0 :(得分:5)
LLVM会将某个异常事件视为立即崩溃。如果使用的实现/编译设置启用了异常,则会抛出一个unwind并找不到catch处理程序并调用std::terminate
。如果实现/编译设置禁用异常,则实现必须提供一些替代行为。大多数人会以这种或那种方式立即崩溃。
LLVM上的开发人员使用这些设置测试他们的代码,并小心避免可能发生的情况。
一种无法直接避免的情况是分配失败。 LLVM根本不支持分配可能失败且用户必须捕获bad_alloc
的平台。如果平台无法在任何时候分配内存,LLVM将崩溃。
事实证明,今天绝大多数非嵌入式平台都使用某种形式的overcommit。由于LLVM的设计性质,我们没有特别有用的机制来优雅地响应分配内存的失败。因此,它被认为是致命和不可恢复的错误,无论我们是否启用例外,我们都会在此时终止该过程。
答案 1 :(得分:1)
libc ++实现包含对_LIBCPP_NO_EXCEPTIONS
的检查,这是对编译器支持异常的推断。
如果我看一下vector的具体实现,看起来条件是断言而不是抛出异常。但是,我无法对bad_alloc
进行验证。
由于在给出-fno-exceptions
时没有关于行为的文档,我认为应用程序崩溃了。