28

我通常从来没有在 C++ 中看到过新的测试,我想知道为什么。

Foo *f = new Foo;

// f is assumed as allocated, why usually, nobody test the return of new?

4

6 回答 6

50

根据当前标准,new永远不会返回NULL,而是抛出 std::bad_alloc 。如果您不希望 new 抛出(按照旧标准)而是返回 NULL ,则应该通过使用“ (std::nothrow) ”对其进行后缀来调用它。IE

Foo* foo = new (std::nothrow) Foo;

当然,如果您有一个非常旧或可能损坏的工具链,它可能不符合标准。

于 2008-10-27T08:03:34.653 回答
7

这完全取决于您的编译器 VC++ 最高版本 6 如果新运算符失败,则在非 MFC 应用程序上给出 NULL。

现在,当您将 STL 与 VC++ 6 一起使用时,问题会变得更大,因为 STL 符合标准,当他需要获取一些内存时,它永远不会测试 NULL,并猜测在低内存条件下会发生什么......

因此,对于仍然使用 VC++ 6 和 STL 的每个人,请查看这篇文章以获得修复。 不要让内存分配失败使您的传统 STL 应用程序崩溃

于 2008-10-27T10:37:03.457 回答
5
  1. new默认抛出std::bad_alloc。如果使用默认值,则检查 null 已过时,但必须处理异常。这种默认行为与 C++ 异常安全范式一致——它通常规定对象要么是构造的,要么是未分配的

  2. 如果您通过 using 覆盖默认值new (std::nothrow),则需要检查 null。“新建”既分配又提交页面,因此可能会耗尽内存,要么是因为您用完了页面描述符,要么是因为没有可用的物理内存

  3. 研究你的操作系统的内存管理。C/C++ 参考机不知道您的操作系统如何管理内存,因此仅依靠语言是不安全的。例如内存分配出错,请阅读 C malloc()+ Linux overcommit

于 2008-10-27T11:23:12.660 回答
4

这完全取决于代码所针对的 C++ 版本。长期以来,c++ 规范已经声明,至少在默认情况下,new 中的失败将导致 c++ 异常,因此任何执行测试的代码都是完全多余的。现在大多数编程也针对虚拟内存操作系统,几乎不可能耗尽内存,而且内存不足的情况是如此致命,以至于让应用程序在下一次 NULL 访问时崩溃是一种很好的方法终止。

只有在嵌入式编程中,异常处理被认为是过多的开销,并且内存非常有限,程序员才会费心检查新的故障。

于 2008-10-27T08:05:42.263 回答
3

如此处所引

“在符合 ISO C++ 标准的编译器中,如果没有足够的内存用于分配,代码将抛出 std::bad_alloc 类型的异常。所有后续代码都将中止,直到错误在 try-catch 块或程序异常退出,程序不需要检查指针的值,如果没有抛出异常,则分配成功。

于 2008-10-27T08:06:12.887 回答
0

通常没有人测试新代码中 new 的返回,因为 Visual Studio 现在抛出标准所说的方式。

在旧代码中,如果已经进行了黑客攻击以避免抛出,那么您最好还是进行测试。

于 2008-10-27T08:03:55.997 回答