std::nothrow
的理想用法是什么?
答案 0 :(得分:11)
我只是将其用作优化(或代码简化),否则我会立即使用常规new来捕获try-catch块,捕获std::bad_alloc
。
这是一种非常罕见的情况,因为很少能够在呼叫站点处有效地处理内存不足。通常你会因为需要而分配内存,而不是因为你非常喜欢拥有内存但却没有内存。传递空指针的代码备份一系列调用者,直到最终有人能够处理问题,这不是惯用的C ++。
虽然可以立即处理错误,但可能会发生错误。例如,您可能处于这样的情况:在给定足够工作空间的情况下您将使用一种算法或技术,而在没有的情况下使用不同的,较慢的算法或技术。那么,你会直接用new
分配这样的工作空间吗?不正常。无论如何,您有时必须小心这种方法,因为如果您的操作系统过度使用,那么一般情况下无法在应用程序级别优雅地处理内存不足。
请注意,涉及std :: nothrow的表达式仍然会抛出异常(特别是来自正在分配的对象的任何构造函数),所以如果你希望避免它只需要一个的东西抛出一个例外。您还必须确保构造函数不会抛出。
就我而言,那些完全没有使用异常的C ++程序的日子已经结束了。我想如果他们为我恢复,由于某些特定的风格指南,那么这是另一个可能不需要新的原因。
答案 1 :(得分:9)
据我了解,几乎没有,也没有。
答案 2 :(得分:9)
将C程序移植到C ++。你的C程序在每个malloc之后都有所有那些检查,没有例外的概念。因此,将每个malloc更改为new(nothrow)比将每个malloc包装在try块中要简单得多。
答案 3 :(得分:4)
如果您的应用程序需要进行纳米优化并且无法允许异常处理的开销,那么可能需要nothrow
。
请记住,Stroustrup非常坚定,程序员可以关闭C ++的开销。 (但作为一个警告,仅仅因为你有选择并不意味着你应该。)
答案 4 :(得分:4)
当你想要在每次新的之后检查null时,你使用std :: nothrow。在制定标准的第一个版本时,需要许多遗留代码。之后写的很多遗留代码也使用它,因为人们偏执的例外。偶尔你会碰到一个仍然存在的人。
你真的很想做到这一点,甚至花了我一秒钟才能记住你在谈论的WTF。
答案 5 :(得分:3)
我知道有旧版本的C ++(特别是微软)在没有分配内存时没有抛出,而是返回NULL。这将是维护与旧代码兼容的简单方法,而不是改变所有逻辑。
答案 6 :(得分:1)
http://www.cplusplus.com/reference/std/new/nothrow/
这种结构很少使用,因为我怀疑它并没有真正影响内存分配性能,而是可以用来方便。
仍然,我通常首选通用变体。
答案 7 :(得分:1)
我可以想象这可以用作自定义分配器的快速路径优化 - 例如,失败当前请求并在稍后/空闲时间增加池。几乎是一个角落的案例。
答案 8 :(得分:-2)
只有极少数程序应该分配超过1 GiB的内存,并且由于现代系统过度使用内存,new
将永远不会返回null或抛出这些系统。因此,完全没有必要检查new / malloc的返回值。只是保持你的记忆足迹,让内存不足的杀手击落其他进程!