真正的异常:超出 C 内存管理规范
与 C 标准相反,据报道,某些编译器,例如VC6,偏离 new 分配失败时返回 std::bad_alloc 异常的预期行为内存。
通常,当 new 无法获取请求的内存时,它会触发 std::bad_alloc 异常,遵循既定的 C 标准。然而,对于 VC6,采取了另一种方法。
据报道,VC6 在内存分配失败时返回 0(或 NULL),而不是返回异常。这种行为与标准不同,可能会导致代码混乱和意外结果。
为了解决这个问题,Microsoft 引入了一个自定义的新处理程序作为推荐的解决方案。然而,在 Visual C 7.0 和 7.1(VS2002 和 VS2003)中,一组复杂的规则决定了 new 是否以不抛出或抛出的方式运行。
随着 Visual C 8.0 (VS2005) 的发布,微软通过执行一致的政策解决了这个问题。在此版本中,new 始终默认抛出异常,除非显式与 nothrownew.obj 对象文件链接。
对于使用为 VC6 设计的旧代码的开发人员,可以利用 std::nothrow 参数模仿该编译器中 new 的行为。通过指定 new(std::nothrow),可以机械地更改代码,使其在不同的编译器中具有类似的功能,从而无需彻底修改现有的错误处理机制。
以上是在 C 中 `new` 总是抛出 `std::bad_alloc` 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!