首页 >后端开发 >C++ >为什么 `new` 有时会返回 NULL 而不是抛出异常?

为什么 `new` 有时会返回 NULL 而不是抛出异常?

Linda Hamilton
Linda Hamilton原创
2024-11-21 17:53:12890浏览

Why Does `new` Sometimes Return NULL Instead of Throwing an Exception?

New() 抛出 NULL 异常:编译器合规性

C 标准要求 new 运算符在以下情况下抛出 std::bad_alloc 异常:它无法分配内存。然而,有人担心某些编译器的行为,特别是 VC6,它可能不遵守此标准。

VC6 不合规

在这种情况下VC6的版本已经证实,新的算子确实没有默认遵循标准。相反,它在失败时返回 0 (NULL)。这种行为给开发人员带来了挑战,因为它需要在每个新语句后显式检查 NULL,从而使代码在美观上没有吸引力。

Microsoft 的响应和解决方法

Microsoft 承认这一非- 合规性并提供了使用自定义新处理程序的解决方法。或者,开发人员可以利用 nothrownew.obj 对象文件在较新的 MSVC 编译器(7.0 及更高版本)中模仿 VC6 的行为。

当前合规状态

幸运的是,在MSVC 8.0 (VS2005),新的默认行为已修改为遵守标准,现在抛出内存分配失败时出现 std::bad_alloc 异常。仅当需要原始的类似 VC6 的行为时,才需要链接到 nothrownew.obj。

手动返回 Null 的选项

开发人员可以灵活地指定 new 应该返回 0 而不是通过使用 std::nothrow 参数抛出异常:

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

此技术允许跨编译器采用一致的方法,并通过消除修改现有错误处理机制的需要来简化代码维护。

以上是为什么 `new` 有时会返回 NULL 而不是抛出异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn