C++ 为什么新的std::nothrow版本没有被广泛使用

C++ 为什么新的std::nothrow版本没有被广泛使用,c++,exception,malloc,new-operator,C++,Exception,Malloc,New Operator,根据,可以通过以下方式创建新对象: MyClass * p1 = new MyClass; 或者 第二个将返回空指针,而不是引发异常 然而,根据我的经验,我几乎看不到这个版本 例如,Google不建议在他们的代码中使用exception,但正如我所见,他们也没有在Chromium中使用nothrow版本 我们有什么理由喜欢默认的而不是其他的吗?即使在不使用异常的项目中 --编辑-- 后续问题:我是否应该检查malloc()的返回值 相反,许多人建议检查malloc的返回值,有些人说是因为: 许

根据,可以通过以下方式创建新对象:

MyClass * p1 = new MyClass;
或者

第二个将返回空指针,而不是引发异常

然而,根据我的经验,我几乎看不到这个版本

例如,Google不建议在他们的代码中使用exception,但正如我所见,他们也没有在Chromium中使用nothrow版本

我们有什么理由喜欢默认的而不是其他的吗?即使在不使用异常的项目中

--编辑--

后续问题:我是否应该检查
malloc()
的返回值

相反,许多人建议检查malloc的返回值,有些人说是因为:

许多分配失败与内存不足无关。碎片可能导致分配失败,因为即使有大量可用内存,也没有足够的连续可用空间


这是真的吗?在这种情况下,我们为什么要对
malloc()
new()
进行不同的处理?

如果使用抛出版本,则无需测试每个
调用的结果,以查看调用是否成功。通常来说,在许多/大多数应用程序中,如果分配失败,您不能做很多事情,只能退出/中止,如果您没有显式地尝试/捕获,异常会自动为您执行此操作

如果您使用
nothrow
版本,您可能会在应用程序中传播一个空指针,并在很长时间后在一个显然与内存分配完全无关的点上崩溃/退出,从而使调试更加困难

然而,根据我的经验,我几乎看不到这个版本

如果可以在本地处理故障,则可以使用它(或者,等效地,从默认版本捕获异常);可能通过请求释放一些其他内存然后重试,或者尝试分配一些较小的内存,或者使用不需要额外内存的替代算法

我们有什么理由喜欢默认的而不是其他的吗

异常的一般原则是:如果您不能在本地处理它,那么本地检查就没有意义了。与返回值不同,异常不能被忽略,因此不可能不顾一切地使用空指针

即使在不使用异常的项目中

通常,内存不足的情况根本无法处理。在这种情况下,终止程序可能是最好的响应;这是对未处理异常的默认响应。因此,即使不使用异常,在大多数情况下,默认的
new
可能是最好的选择

我应该检查
malloc()
的返回值吗

是的:这是检查它是否成功的唯一方法。如果不这样做,那么最终可能会使用空指针,给出未定义的行为:通常是崩溃,但可能是数据损坏或其他奇怪的行为,以及长时间的调试会话(希望如此)来找出哪里出了问题

在这种情况下,我们为什么要区别对待
malloc()
new


因为
malloc
强制我们检查返回值,而
new
为我们提供了较少干扰性错误处理的选项。

如果new失败,您很可能内存不足,无论如何都需要退出……请注意,在其他语言中,如java中,我们区分异常和错误(通常是致命的)。在java中,内存不足是一个错误,而不是一个例外。除了询问意见之外,您的结束问题似乎是矛盾的。根据定义,如果您使用异常抛出版本,那么您就是在使用异常,因此“即使在不使用异常的项目中”的观点也有点没有实际意义。如果“不使用异常”,您的意思是您没有try-catch块,因此运行时将捕获异常并终止程序(通常)您正在使用异常;您只是没有在编写的代码中处理它们。相关的,对于所有说“无论如何都无法恢复,何必麻烦呢?”@WhozCraig您不一定因为没有指定std::nothrow而使用异常。您还可以使用编译器开关禁用它们。
MyClass * p2 = new (std::nothrow) MyClass;