Ste*_*sop 11
我只是将它用作优化(或代码简化),否则我会立即使用常规new,catch来设置try-catch块std::bad_alloc
.
这是一种非常罕见的情况,因为很少能够在呼叫站点处有效地处理内存不足.通常你会因为需要而分配内存,而不是因为你非常喜欢拥有内存但却没有内存.传递空指针的代码备份一系列调用者,直到最终有人能够处理问题,这不是惯用的C++.
虽然错误确实可以立即处理,但可能会发生.例如,您可能处于这样的情况:在给定足够工作空间的情况下您将使用一种算法或技术,而在没有这种情况下使用不同的,较慢的算法或技术.那么,你会直接分配这样的工作空间new
吗?不正常.无论如何,您有时必须小心这种方法,因为如果您的操作系统过度使用,那么通常您无法在应用程序级别优雅地处理内存不足.
请注意,涉及std :: nothrow的表达式仍然可以抛出异常(特别是来自正在分配的对象的任何构造函数),因此如果您希望避免抛出异常,则只需要一件事.您还必须确保构造函数不会抛出.
至于我担心不使用异常的C++程序的日子已经结束了.我想如果他们为我恢复,由于一些特定的风格指南,那么这是另一个可能的原因,不需要新的.
将C程序移植到C++.你的C程序在每个malloc之后都有所有那些检查,没有例外的概念.因此,将每个malloc更改为new(nothrow)要比将tryoc块中的每个malloc包装起来要简单得多.
也许如果您的应用程序需要纳米优化并且不允许异常处理的开销,那么也许nothrow
需要。
请记住,Stroustrup 非常坚定地认为程序员可以关闭 C++ 中的开销。(但需要注意的是,仅仅因为你有选择并不意味着你应该这样做。)
http://www.cplusplus.com/reference/std/new/nothro/
这种结构很少使用,因为我怀疑它不会真正影响内存分配性能,而是可以为了方便而使用。
尽管如此,通用变体通常是首选。