【发布时间】:2013-08-06 08:58:11
【问题描述】:
根据C++ reference,您可以通过以下方式新建对象:
MyClass * p1 = new MyClass;
或通过
MyClass * p2 = new (std::nothrow) MyClass;
第二个将返回一个空指针而不是抛出异常。
但是,根据我的经验,我几乎看不到这个版本。
例如,Google 不建议在他们的代码中使用异常,但我可以看到他们在 Chromium 中也没有使用 nothrow 版本。
有什么理由让我们更喜欢默认的而不是 nothrow 吗?即使在不使用异常的项目中?
-- 编辑--
后续问题:我应该检查malloc()的返回值吗?
看来,恰恰相反,很多人建议检查malloc的返回值,有人说是因为:
许多分配失败与内存不足无关。碎片可能会导致分配失败,因为即使有足够的可用内存,也没有足够的连续空间可用。
这是真的吗?为什么在这种情况下我们对待malloc() 和new() 的方式不同?
【问题讨论】:
-
如果 new 失败,你很可能内存不足,无论如何都需要退出......
-
请注意,在其他语言中,例如 java - 我们区分 exception 和 error(通常 致命)。在 java 中,内存不足是 error 而不是 exception。
-
除了征求意见外,您的结束问题似乎自相矛盾。根据定义,如果您使用抛出异常的版本,那么您正在使用异常,因此“即使在不使用异常的项目中”这一点也没有实际意义。如果“不使用异常”意味着您没有 try-catch-blocks,因此运行时将捕获异常并终止程序(通常)您 stll 使用异常;您只是没有在您编写的代码中处理它们。
-
相关,对于每个人都说“你无论如何都无法恢复,所以为什么要打扰”:Is “Out Of Memory” A Recoverable Error?
-
@WhozCraig 您不一定会使用异常,因为您没有指定 std::nothrow。您也可以使用编译器开关禁用它们。
标签: c++ exception malloc new-operator