C++ 何时应使用std::nothrow?

C++ 何时应使用std::nothrow?,c++,exception,nothrow,C++,Exception,Nothrow,std::nothrow的理想用法是什么? 这种构造很少使用,因为我怀疑它实际上并不影响内存分配性能,而是可以方便地使用 P.>通常,我喜欢泛型变量。我理解,几乎没有,也没有。 < P>移植C程序到C++。在每次malloc之后,您的C程序都有所有这些检查,并且没有异常的概念。因此,将每一个MALLC转换为新的(NoFrad)比在一个尝试块中封装每个MALOC要简单得多。 < P>我知道有一些旧版本的C++(特别是微软),它们在无法分配内存时没有抛出,而是返回了NULL。这将是一种维护与旧代码

std::nothrow的理想用法是什么?

这种构造很少使用,因为我怀疑它实际上并不影响内存分配性能,而是可以方便地使用


<> P.>通常,我喜欢泛型变量。

我理解,几乎没有,也没有。

< P>移植C程序到C++。在每次malloc之后,您的C程序都有所有这些检查,并且没有异常的概念。因此,将每一个MALLC转换为新的(NoFrad)比在一个尝试块中封装每个MALOC要简单得多。

< P>我知道有一些旧版本的C++(特别是微软),它们在无法分配内存时没有抛出,而是返回了NULL。这将是一种维护与旧代码兼容性的简单方法,而不是更改所有逻辑。

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


请记住,Stroustrup非常坚定程序员可以关闭C++中的开销。(作为一个警告,仅仅因为你有选择权并不意味着你应该这样做。)

当你想在每次新建后检查null时,你可以使用std::nothrow。当标准的第一个版本制定时,很多遗留代码都需要它。很多后来编写的遗留代码也会使用它,因为人们对异常非常敏感。偶尔你会遇到一个仍然是你的人


你真的想这么做是非常罕见的,我甚至花了一秒钟的时间才想起你所说的WTF。

我可以想象,这可以作为一种快速路径优化与自定义分配器一起使用,比如,使当前请求失败,并在稍后/空闲时间增加池。这几乎是一个绝妙的例子。

我只会把它作为一种优化(或代码简化)使用,否则我会在使用常规的新捕获时立即放置一个try-catch块

这是一种非常罕见的情况,因为在调用站点能够有效地处理内存不足的情况非常罕见。通常你分配内存是因为你需要它,不是因为你很想拥有它,而是因为你可以不需要它。将空指针传递给调用方链的代码,直到最终有人能处理这个问题不是惯用的C++。 尽管错误确实可以立即得到处理,但也可能发生这种情况。例如,您可能会遇到这样的情况:在给定足够的工作空间的情况下,您将使用一种算法或技术,而在不使用该算法或技术的情况下,使用另一种较慢的算法或技术。那么,您是否会使用
new
直接分配此类工作空间?不正常。不管怎样,您有时必须小心使用这种方法,因为如果您的操作系统过度使用,那么通常您无法在应用程序级别优雅地处理内存不足的问题

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


就我而言,C++程序的日子根本不使用例外,已经结束了。我想,如果由于某种特定的样式指南,它们为我重新开始,那么这就是不需要任何新功能的另一个可能原因。

只有极少数程序应该分配超过1 GiB的内存,而且由于现代系统过度占用内存,
new
将永远不会在这些系统上返回null或抛出。因此,根本没有必要检查new/malloc的返回值。只需降低内存占用,让内存不足杀手击倒其他进程

将它们保留为
malloc
,不是更简单吗?即使在C++中, MalOC/也不会抛出。@ Steve Jessop,有没有保证<代码> Malc 和<代码>免费< /COD>一起工作?如果不是,转换可能是最简单的,这样您就可以保持一致。@马克:不确定“一起工作”是什么意思。如果C代码没有释放它在mallocs上的所有内容,那么修复错误与移植它是分开的。如果C库<代码> Malc C < /Cult>内存,并将其留给调用方<代码> Fabue/Cuff>,那么C++版本的客户端可能更喜欢<代码> Dele> <代码>,但是通过改变接口,必须对已经使用旧C版本的任何C++代码进行更改。我想我可以同意这个改变,因为没有这种现有的C++代码。然而,不愉快的界面,有可能更好的方法来改进C++版本。@ Mark:有没有任何可想象的原因,格式>代码> Malc 和<代码>免费< /代码>不一起工作?§20.4.6他们几乎必须…@conio,谢谢您的参考。当然,我的意思是“代码> MalOC < /COD> <代码>删除<代码>,而不是<代码> MalOC/<代码> > <代码>免费>代码>。Afak不是微软,它只是在引入异常之前新的C++标准中的工作方式。Tizen OS不支持标准异常处理。他们在两阶段构造器中使用nothrow。这个答案和这个问题有什么关系?问题是关于STD::抛出而不是不抛出异常的方法。“就我而言,C++程序的使用时间根本不例外,”结束了。欢迎来到游戏开发。