Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 加上-fno例外情况“;,“会发生什么?”;新T";?_C++_Exception - Fatal编程技术网

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的情况如何。