使用"-fno-exceptions","new T"会发生什么?

Joh*_*itb 57 c++ exception

我想知道,如果我使用禁用异常处理的选项编译我的程序,new T仍然会抛出?bad_alloc-fno-exceptions

或将编译器(GCC和铛支持该选项)隐含变换使用new Tnew (nothrow) T

Mat*_*man 49

我理解它的方式operator new是由libstdc ++定义的.如果您现在编译自己的代码-fno-exceptions,则无法捕获任何异常,但您仍将链接到正常版本的libstdc ++,这会引发异常.

所以是new T的,即使有了,也会抛出异常-fno-exception.

但是,如果你也编译了libstdc ++,-fno-exception那么事情会变得不同.现在,new T不能抛出异常但是,如果我读了libstdc ++手册,它会调用它abort().

看来,如果你希望你new T在失败时返回NULL,唯一的方法是明确指定nothrow......


nos*_*nos 31

我无法给出关于-fno-exceptions的所有特权的明确答案,只是对32位linux机器上的观察,gcc 4.5.1 - bad_alloc是否带有和不带 -fno-exceptions

[21:38:35 1 ~/tmp] $ cat bad_alloc.cpp

int main()
{
    char* c = new char[4000000000U];
}
[21:38:58 1 ~/tmp] $ g++ bad_alloc.cpp
[21:39:06 1 ~/tmp] $ ./a.out
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted
[21:39:07 1 ~/tmp] $ g++ -fno-exceptions bad_alloc.cpp
[21:39:16 1 ~/tmp] $ ./a.out
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted
Run Code Online (Sandbox Code Playgroud)

  • 您不需要使用`-fno-exceptions`重建C++标准库以获得完全期望的结果吗? (25认同)

Mic*_*fik 9

这不是一个明确的答案,但GCC手册(参见"不做"一节)有:

在详细说明库支持之前-fno-exceptions,首先要记下使用此标志时丢失的内容:它将破坏尝试传递代码的异常,-fno-exceptions无论代码是否具有任何try或catch构造.如果您可能有一些抛出的代码,则不应使用 -fno-exceptions.

我阅读的方式,你可能必须明确要求nothrow版本new是完全安全的.