我通常从未在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)
当然,如果您有一个非常旧或可能已损坏的工具链,它可能不符合标准.
这一切都取决于您的编译器VC++版本6如果新的运算符失败,在非MFC应用程序上给出NULL.
当你使用例如带有VC++ 6的STL时问题变得更大,因为STL符合标准,当他需要获得一些内存时它永远不会测试NULL,并猜测在低内存条件下会发生什么......
因此,对于仍然使用VC++ 6和STL的每个人,请查看本文以获取修复. 不要让内存分配失败会破坏您的传统STL应用程序
new
std::bad_alloc
默认抛出。如果使用默认值,则检查 null 已过时,但需要处理异常。这种默认行为与 C++ 异常安全范式一致——它通常规定一个对象要么被构造,要么不被分配
如果您使用 覆盖默认new (std::nothrow)
值,则需要检查 null。“新建”同时分配和提交页面,因此可能会耗尽内存,要么是因为页面描述符用完了,要么是因为没有可用的物理内存
研究你的操作系统的内存管理。C/C++ 参考机不知道您的操作系统如何管理内存,因此仅依靠语言是不安全的。例如内存分配变坏,请阅读 C malloc()
+ Linux overcommit
归档时间: |
|
查看次数: |
3164 次 |
最近记录: |