New 会返回 NULL 吗?
在 C 中,new 运算符负责为新对象分配内存。根据C标准,如果new分配内存失败,预计会抛出std::bad_alloc异常。然而,有传言称某些编译器,例如 Visual C 6 (VC6),偏离了这种行为。
VC6 不合规
传闻是真的。默认情况下,VC6 在这方面不遵守 C 标准。当 new 分配内存失败时,它返回 0(或 NULL)而不是抛出异常。
微软的解决方法
微软认识到了这个问题并提供了建议的解决方法:使用自定义的新处理程序。开发人员可以指定自己的运算符 new 实现,该实现将抛出 std::bad_alloc 异常而不是返回 0。
后来的 MSVC 编译器
在 MSVC 的后续版本中(从 7.0 及更高版本开始),new 的行为变得更加复杂。有一组规则决定它是抛出异常还是返回 0。
VS2005 及以后
使用 VS2005 (MSVC 8.0),微软终于清理干净了这种行为。默认情况下,new 现在会抛出 std::bad_alloc 异常,除非显式链接到 nothrownew.obj。
替代方法:std::nothrow
开发人员还可以指定他们希望 new 返回 0,而不是使用 std::nothrow 参数抛出异常。这允许跨编译器保持一致的行为,即使是为 VC6 编写的遗留代码也是如此。
以上是不同 C 编译器中“new”运算符的行为是什么,特别是在内存分配失败方面?的详细内容。更多信息请关注PHP中文网其他相关文章!