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中文网其他相关文章!