Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.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++ 为什么要检查运算符NEW的返回值?_C++ - Fatal编程技术网

C++ 为什么要检查运算符NEW的返回值?

C++ 为什么要检查运算符NEW的返回值?,c++,C++,Meyers在他的书《改进的50种方法》第二版中写道,我必须检查new的返回类型,但我知道如果操作符new无法分配内存,它会抛出异常,所以对于较新的库,我不需要检查new的返回值,对吗?提前感谢 < P>不,因为C++允许新的在故障时也返回空。 $5.3.4/13-“[注:除非 分配函数是用 一个空的异常规范 (15.4),throw(),表示失败 通过抛出 错误分配例外(第15条, 18.4.2.1);否则返回非空指针。如果 函数声明为空 异常规范,throw(),it 返回null以指示无法

Meyers在他的书《改进的50种方法》第二版中写道,我必须检查new的返回类型,但我知道如果
操作符new
无法分配内存,它会抛出
异常,所以对于较新的库,我不需要检查new的返回值,对吗?提前感谢

< P>不,因为C++允许新的在故障时也返回空。 $5.3.4/13-“[注:除非 分配函数是用 一个空的异常规范 (15.4),throw(),表示失败 通过抛出 错误分配例外(第15条, 18.4.2.1);否则返回非空指针。如果 函数声明为空 异常规范,throw(),it 返回null以指示无法执行 分配存储和非空 指针指向其他位置。]如果分配 函数返回null,初始化 不应这样做,取消分配 不应调用函数,并且 新表达式的值应为 空


总的来说,我认为你是对的:现代的库通常会为此抛出异常。但是如果你分发源代码,一些编译器仍然会返回NULL而不是抛出异常。在这些情况下,它可能会很有用,但这实际上取决于你是否要去那里调试它,以及这个程序的稳定性有多重要m是


另外,有人指出,这是当今一个非常模糊的问题,使用古代编译器的人要承担这个负担。

这有点上下文无关。在这种情况下,分配函数是什么?天真的读者可能会猜到这意味着malloc()或者新运算符在内部使用的任何函数-但新运算符使用的函数是对最终程序员隐藏的实现细节。在这种情况下,“分配函数”必须是新运算符本身?并且标准新运算符总是抛出异常(自2003年起),除非调用为:new(std::nothrow)…;@Chris Becke:我认为该库可能有自己的自定义分配器,new将使用它,因此它有可能返回NULL而不是抛出异常。我是否遗漏了什么?你说的是
运算符new(nothrow)这里不是常规的代码>运算符new <代码>。这两个都属于分配函数类。C++不允许“正则”new返回null -它可能永远也不允许“<代码>运算符new(NoWrOffice)<代码>返回null -它必须在失败时返回null。我只是浏览了第7项。“为内存不足的情况做好准备”,并明确建议处理
std::bad_alloc
。我遗漏了什么?具体来说,哪些编译器返回0?它们要么是古老的,因此是预标准的,要么是已经决定的(出于任何原因)如果你把你描述的标准C++作为源代码,任何人接收它都没有理由指望它能在不象标准C++编译器的东西上工作。我认为检查这个是不好的,除非有特定的理由来支持一个特别的DoDy编译器,因为它会干扰这个。用垃圾代码编写代码。这是错误的答案。检查新代码的结果是否为NULL会带来错误的安全感,也可能会误导维护人员,使其认为原始开发人员希望new返回NULL,从而导致混乱。您应该按照标准编程。我试图解释为什么有人会这样做,但我可能已经失败了为了给作者辩护太多。我有一个编译器不久前会这么做(但不记得是哪一个)。我同意,这几乎从来没有在new上做过,而且它确实增加了很多混乱,特别是考虑到它也应该是异常处理代码。