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
相关产品推荐
相关产品推荐

