我通常从不在C++中看到对“new”的测试,我想知道为什么。
Foo *f = new Foo;
//假设f已经被分配,为什么通常情况下没有人测试new的返回值?
我通常从不在C++中看到对“new”的测试,我想知道为什么。
Foo *f = new Foo;
//假设f已经被分配,为什么通常情况下没有人测试new的返回值?
根据当前的标准,new不会返回NULL,而是会抛出一个std::bad_alloc异常。如果你不想让new抛出异常(遵循旧标准)而是希望它返回NULL,你应该在其后加上"(std::nothrow)"。
Foo* foo = new (std::nothrow) Foo;
当然,如果你使用的是非常老旧的或可能已经损坏的工具链,它就可能不遵循标准。
这完全取决于你使用的编译器。对于非MFC应用程序,VC++ 6及以下版本在new操作失败时会返回NULL。
当你在VC++ 6中使用STL时,问题变得更加复杂,因为STL遵循标准,它永远不会在需要获取一些内存时测试NULL,并且在内存紧张的情况下会发生什么...
因此,对于仍在使用VC++ 6和STL的人,请查看此文章以获得修复方法。 Don't Let Memory Allocation Failures Crash Your Legacy STL Application
默认情况下,new
会抛出 std::bad_alloc
异常。如果使用默认设置,则检查 null 指针已经过时,但需要处理异常。这种默认行为与 C++ 异常安全范例一致 - 它通常提供对象要么构造成功,要么未分配。
如果你使用 new (std::nothrow)
覆盖默认设置,则需要检查 null 指针。"New" 同时分配和提交页面,因此可能会耗尽内存,原因可能是由于页描述符不足或没有可用的物理内存。
研究您操作系统的内存管理。C/C++ 参考机器不知道您的操作系统如何管理内存,因此仅依赖语言是不安全的。例如,有关内存分配失败的示例,请阅读 C malloc()
+ Linux 过度承诺。
这完全取决于代码针对的 C++ 版本。
C++ 规范已经很长一段时间以来声明,默认情况下,new 失败会导致 C++ 异常,因此任何执行测试的代码都将是完全多余的。
现今大多数编程也瞄准虚拟内存操作系统,其中几乎不可能耗尽内存,并且内存不足的情况非常致命,只需让应用程序在下一个 NULL 访问时崩溃即可终止。
只有在嵌入式编程中,异常处理被认为是太过沉重负担且内存非常有限时,程序员才费心检查 new 失败。
如此处所述:
在符合ISO C++标准的编译器中,如果内存不足以进行分配,则代码会抛出std::bad_alloc类型的异常。直到错误被try-catch块处理或程序异常退出之前,所有后续的代码都将被中止。程序不需要检查指针的值;如果没有抛出异常,则分配成功。