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

std::make_unique()的异常安全性问题问询

直接new与std::make_unique的异常安全差异分析

咱们先聊直接用new的写法:

auto p = new T( U(std::move(v)) );

假设T(U(std::move(v)))本身异常安全(也就是不会抛出异常,这部分是库使用者要负责的),那这段代码是具备异常安全性的。核心关键点在于:初始化表达式U(std::move(v))是在内存分配完成之后才会被求值。也就是说,只有内存分配成功了,才会执行这个初始化操作,不会出现“内存没分配成,但初始化操作已经跑起来”的资源泄漏问题。

再看对应的std::make_unique写法:

auto p = std::make_unique<T>( U(std::move(v)) );

这里的逻辑就不一样了——初始化表达式U(std::move(v))会在内存分配之前就被求值。这意味着,如果U(std::move(v))执行时抛出异常,此时内存还没开始分配,虽说不会有内存泄漏,但如果U的构造涉及其他资源(比如打开文件、申请其他动态内存),就可能出现资源泄漏风险;哪怕U本身不抛异常,这个求值顺序的差异也直接让它和直接new写法的异常安全特性产生了区别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:14:51