新的抛出异常:C 标准合规性检查
C 标准要求 new 运算符在以下情况下抛出 std::bad_alloc 异常:内存分配失败。然而,人们对某些编译器(尤其是 VC6)在这方面的行为表示担忧。
VC6:打破标准
证实了谣言,VC6 表现出非- 合规行为。当遇到分配失败时,它不会抛出异常,而是返回 0(或 NULL)值。这种与标准的偏差给开发人员带来了潜在的挑战,因为它需要在每次新调用后进行显式空检查,从而导致代码美观问题。
VC6 的自定义解决方法
为了缓解 VC6 中的此问题,Microsoft 提供了一种涉及自定义新处理程序的解决方法。此解决方案通过异常处理补充了默认行为。
较新 MSVC 编译器中的变量行为
在 7.0 版本及以上的 MSVC 编译器中,new 的行为更加复杂。这些编译器可能会根据特定规则(包括与 nothrownew.obj 对象文件的链接)默认抛出或不抛出行为。
MSVC 8.0 及更高版本中的一致性
随着MSVC 8.0(VS2005)的发布,采用了更加一致的方法。此编译器始终默认抛出新异常,除非显式链接到 nothrownew.obj。
使用 std::nothrow 实现非抛出行为
开发人员可以显式请求新的异常返回 0 而不是使用 std::nothrow 参数抛出异常。这允许向后兼容为 VC6 行为编写的现有代码。
通过了解这些细微差别并实施适当的解决方法,开发人员可以确保他们的 C 代码遵守标准,无论他们使用什么编译器。
以上是您的 C 编译器是否正确处理'new”运算符异常?的详细内容。更多信息请关注PHP中文网其他相关文章!