gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:50:30 31 4
gpt4 key购买 nike

根据C++ reference ,您可以通过以下方式新建对象:

MyClass * p1 = new MyClass;

或通过

MyClass * p2 = new (std::nothrow) MyClass;

第二个将返回一个空指针而不是抛出异常。

但是,根据我的经验,我几乎看不到这个版本。

例如,Google 不建议在他们的代码中使用异常,但我可以看到他们在 Chromium 中也没有使用 nothrow 版本。

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

-- 编辑--

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

看来,恰恰相反,很多人建议检查malloc的返回值,有人说是因为:

many allocation failures have nothing to do with being out of memory. Fragmentation can cause an allocation to fail because there's not enough contiguous space available even though there's plenty of memory free.

这是真的吗?为什么在这种情况下我们对待 malloc()new() 的方式不同?

最佳答案

However, I hardly see this version in my experience.

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

Is there any reason that we prefer the default one against the nothrow one?

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

Even in a project that is not using exception?

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

should I check return value of malloc()?

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

Why we treat malloc() and new differently in this case?

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

关于c++ - 为什么新的 std::nothrow 版本没有被广泛使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18061781/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com