Ste*_*sop 11

我只是将它用作优化(或代码简化),否则我会立即使用常规new,catch来设置try-catch块std::bad_alloc.

这是一种非常罕见的情况,因为很少能够在呼叫站点处有效地处理内存不足.通常你会因为需要而分配内存,而不是因为你非常喜欢拥有内存但却没有内存.传递空指针的代码备份一系列调用者,直到最终有人能够处理问题,这不是惯用的C++.

虽然错误确实可以立即处理,但可能会发生.例如,您可能处于这样的情况:在给定足够工作空间的情况下您将使用一种算法或技术,而在没有这种情况下使用不同的,较慢的算法或技术.那么,你会直接分配这样的工作空间new吗?不正常.无论如何,您有时必须小心这种方法,因为如果您的操作系统过度使用,那么通常您无法在应用程序级别优雅地处理内存不足.

请注意,涉及std :: nothrow的表达式仍然可以抛出异常(特别是来自正在分配的对象的任何构造函数),因此如果您希望避免抛出异常,则只需要件事.您还必须确保构造函数不会抛出.

至于我担心不使用异常的C++程序的日子已经结束了.我想如果他们为我恢复,由于一些特定的风格指南,那么这是另一个可能的原因,不需要新的.


Pup*_*ppy 9

据我了解,几乎没有,也没有.


Ton*_*nyK 9

将C程序移植到C++.你的C程序在每个malloc之后都有所有那些检查,没有例外的概念.因此,将每个malloc更改为new(nothrow)要比将tryoc块中的每个malloc包装起来要简单得多.

  • 将它们留作"malloc"不是更简单吗?即使在C++中,`malloc`也不会抛出. (14认同)
  • @Mark:不确定你的意思是"一起工作".如果C代码没有释放它所有的mallocs,那么bug修复它就与移植它是分开的.如果一个C库`malloc`的内存并将它留给调用者`free`,那么C++版本的客户端可能更喜欢`delete`而不是**但*通过改变接口,你必须对这个进行更改任何已经使用旧C版本的C++代码.假设没有这样的现有C++代码,我想我可以同意这个改变.但是,不愉快的界面可能有更好的方法来改进C++版本. (4认同)
  • @conio,感谢您的参考.当然我的意思是`malloc`和`delete`,而不是'malloc`和`free`. (2认同)

chr*_*ock 5

也许如果您的应用程序需要纳米优化并且不允许异常处理的开销,那么也许nothrow需要。

请记住,Stroustrup 非常坚定地认为程序员可以关闭 C++ 中的开销。(但需要注意的是,仅仅因为你有选择并不意味着你应该这样做。)


Yip*_*Yay 1

http://www.cplusplus.com/reference/std/new/nothro/

这种结构很少使用,因为我怀疑它不会真正影响内存分配性能,而是可以为了方便而使用。

尽管如此,通用变体通常是首选。