C++ 加上-fno例外情况“;,“会发生什么?”;新T";?
我在想,如果我使用C++ 加上-fno例外情况“;,“会发生什么?”;新T";?,c++,exception,C++,Exception,我在想,如果我使用-fno exceptions选项来禁用异常处理,那么new T还会抛出bad\u alloc吗 或者编译器(GCC和clang支持该选项)是否会将new T的使用隐式转换为new(nothrow)T?这不是一个明确的答案,但(请参见“不使用”一节)有以下内容: 在详细说明库支持之前 对于-fno异常,首先通过 注意当这个旗子挂上时丢失的东西 使用:它将打破异常 试图通过已编译的代码 有-无异常无论是否 该代码有任何尝试或捕获 构造。如果你能吃点的话 抛出的代码,您不应该使用
-fno exceptions
选项来禁用异常处理,那么new T
还会抛出bad\u alloc
吗
或者编译器(GCC和clang支持该选项)是否会将
new T
的使用隐式转换为new(nothrow)T
?这不是一个明确的答案,但(请参见“不使用”一节)有以下内容:
在详细说明库支持之前
对于-fno异常
,首先通过
注意当这个旗子挂上时丢失的东西
使用:它将打破异常
试图通过已编译的代码
有-无异常
无论是否
该代码有任何尝试或捕获
构造。如果你能吃点的话
抛出的代码,您不应该使用
-fno异常
按照我的理解,你可能必须明确要求新版本的nothrow是完全安全的。关于fno异常的所有好处,我不能给出一个明确的答案,仅仅是在32位linux机器上的观察,gcc 4.5.1-bad_alloc被抛出,有和没有
-fno异常
[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
在许多异常处理系统中,如果例程“foo”调用“bar”,而“bar”又调用“moo”,并且“moo”抛出异常,那么异常可以干净地返回到“foo”的唯一方法就是“bar”有代码来处理异常。即使“bar”将允许异常不受破坏地传播,它通常也必须确保在允许执行离开作用域之前正确销毁其局部变量。这将需要在“bar”中添加额外的代码;在大多数系统中,即使没有引发异常,其中一些代码也必须执行
顺便说一句,在一些ARM处理器上,如Cortex M3或在ARM模式下运行的Arm7,如果调用者也将在ARM模式下运行,则可以通过让“正常”子例程返回LR+4(超出正常返回地址的四个字节)并让异常退出到LR来允许异常,而不需要任何执行时间开销(这将是一个4字节的分支指令)但是,这种行为与手臂上的正常做法相反,而且这种设计不会很好地移植到Cortex M0。据我所知,
操作符new
是由libstdc++定义的。如果您现在使用-fno异常编译自己的代码,则无法捕获任何异常,但仍将再次链接nst libstdc++的正常版本,它会引发异常
因此,是的,newt
将抛出异常,即使是-fno异常
但是,如果您在编译libstdc++时也使用了-fno exception
,情况就不同了。现在,new T
无法引发异常,但是,如果我读取它,它将调用abort()
似乎,如果你想让你的新T
在失败时返回NULL,唯一的方法就是明确地指定nothrow
…有趣的问题。但是,你为什么要禁用它呢?我不想禁用它:)只是好奇,你是在处理那些经常抛出错误alloc
的代码吗?我没有处理任何代码。我只是在处理空气中的想法。因为C++标准不考虑这种情况,而且由于许多标准库实现假定(因为标准)分配器总是返回有效的内存块(它是有保证的),所以你必须放弃这样的程序中的标准库…因此,我猜想,您可以提供自己的新
和删除
。这将需要一个自定义的libstdcxx动态库。由于这里解释的原因,这样的库不能符合规范:那么,考虑到这些信息,GCC是否将new
转换为new(nothrow)
-难道你不需要用“代码>-fNO异常< /CODE”来重建C++标准库,以获得完全期望的结果吗?CLAN在禁用异常时用SUP编译代码来停止代码,GCC是否有类似的行为?@ NOS与接受的答案有很好的对比,并且更详细地显示,上面的cat bad_alloc.cpp的情况如何。