测试C++中"new"的返回是否有用?

Gui*_*uid 24 c++ new-operator

我通常从未在C++中看到新测试,我想知道为什么.

Foo *f = new Foo;

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

Dav*_*olm 46

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

Foo* foo = new (std::nothrow) Foo;
Run Code Online (Sandbox Code Playgroud)

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

  • MSVC <= 2003是一个破碎的工具链 (3认同)
  • 尽管如此,解决问题并没有什么坏处! (2认同)

Joã*_*sto 7

这一切都取决于您的编译器VC++版本6如果新的运算符失败,在非MFC应用程序上给出NULL.

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

因此,对于仍然使用VC++ 6和STL的每个人,请查看本文以获取修复. 不要让内存分配失败会破坏您的传统STL应用程序


n-a*_*der 5

  1. newstd::bad_alloc默认抛出。如果使用默认值,则检查 null 已过时,但需要处理异常。这种默认行为与 C++ 异常安全范式一致——它通常规定一个对象要么被构造,要么不被分配

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

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