在任何情况下 new 都会返回 NULL 吗?

编程入门 行业动态 更新时间:2024-10-24 02:00:33
本文介绍了在任何情况下 new 都会返回 NULL 吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我知道根据 C++ 标准,如果 new 无法分配内存,它应该抛出 std::bad_alloc 异常.但我听说有些编译器如 VC6(或 CRT 实现?)不遵守它.这是真的 ?我问这个是因为在每个新语句之后检查 NULL 会使代码看起来非常难看.

I know that according to C++ standard in case the new fails to allocate memory it is supposed to throw std::bad_alloc exception. But I have heard that some compilers such as VC6 (or CRT implementation?) do not adhere to it. Is this true ? I am asking this because checking for NULL after each and every new statement makes code look very ugly.

推荐答案

VC6 在这方面默认是不合规的.VC6的new返回0(或NULL).

VC6 was non-compliant by default in this regard. VC6's new returned 0 (or NULL).

这是微软关于这个问题的知识库文章以及他们建议的使用自定义 new 处理程序的解决方法:

Here's Microsoft's KB Article on this issue along with their suggested workaround using a custom new handler:

  • 在 Visual C++ 中,Operator new 不会在失败时引发 bad_alloc 异常

如果您有为 VC6 行为编写的旧代码,您可以通过链接名为 nothrownew.obj 的对象文件,使用较新的 MSVC 编译器(例如 7.0 及更高版本)获得相同的行为.实际上有一个相当复杂的一组规则7.0 和 7.1 编译器(VS2002 和 VS2003)来确定它们是默认不抛出还是抛出 new.

If you have old code that was written for VC6 behavior, you can get that same behavior with newer MSVC compilers (something like 7.0 and later) by linking in a object file named nothrownew.obj. There's actually a fairly complicated set of rules in the 7.0 and 7.1 compilers (VS2002 and VS2003) to determine whether they defaulted to non-throwing or throwing new.

似乎 MS 在 8.0 (VS2005) 中对此进行了清理—现在它总是默认为抛出新的,除非你特别链接到 nothrownew.obj.

It seems that MS cleaned this up in 8.0 (VS2005)—now it always defaults to a throwing new unless you specifically link to nothrownew.obj.

请注意,您可以指定您希望 new 返回 0 而不是使用 std 抛出 std::bad_alloc::nothrow 参数:

Note that you can specify that you want new to return 0 instead of throwing std::bad_alloc using the std::nothrow parameter:

SomeType *p = new(std::nothrow) SomeType;

这似乎在 VC6 中有效,因此它可能是一种或多或少机械地修复代码的方法,以便在所有编译器中都能正常工作,这样您就不必重新处理现有的错误处理.

This appears to work in VC6, so it could be a way to more or less mechanically fix the code to work the same with all compilers so you don't have to rework existing error handling.

更多推荐

在任何情况下 new 都会返回 NULL 吗?

本文发布于:2023-11-29 00:56:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1644639.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:都会   情况下   NULL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!