首页  >  文章  >  后端开发  >  不同 C 编译器中“new”运算符的行为是什么,特别是在内存分配失败方面?

不同 C 编译器中“new”运算符的行为是什么,特别是在内存分配失败方面?

Susan Sarandon
Susan Sarandon原创
2024-11-17 20:14:02540浏览

What is the Behavior of the `new` Operator in Different C   Compilers, Especially Regarding Memory Allocation Failure?

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

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