You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C++中,将构造函数声明为noexcept会隐式使用nothrow版new运算符吗?

构造函数标记noexcept对new运算符的影响

结论:不会,编译器不会因为类的构造函数声明为noexcept,就隐式将new Something解释为使用std::nothrow版本的new运算符。

具体说明:

  • 普通new运算符的行为是独立的:内存分配失败时,它会抛出std::bad_alloc异常,这个逻辑和后续调用的构造函数是否带有noexcept修饰完全无关。
  • noexcept仅作用于构造函数本身:如果构造过程中抛出异常,会直接触发std::terminate终止程序,但这不会改变内存分配阶段的行为。
  • 你的判断是正确的:如果内存分配失败,普通new抛出的std::bad_alloc会触发std::terminate,因为构造函数标记了noexcept,不允许异常传播出构造过程。

如果需要内存分配失败时不抛出异常,必须显式调用nothrow版本的new:

Something *s = new(std::nothrow) Something;

此时内存分配失败会返回nullptr,不会进入构造函数的执行阶段。

内容的提问来源于stack exchange,提问作者Billy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:03:32