只是为了澄清,使用make_unique
仅当表达式中有多个分配(而不仅仅是一个)时才增加异常安全性,对吗?例如
void f(T*);
f(new T);
是完全异常安全的(就分配和东西而言),而
void f(T*, T*);
f(new T, new T);
是不正确的?
不仅当你有多个分配时,而且当你可以在不同的地方扔东西时。考虑一下:
f(make_unique<T>(), function_that_can_throw());
Versus:
f(unique_ptr<T>(new T), function_that_can_throw());
在第二种情况下,允许编译器调用(按顺序):
new T
function_that_can_throw()
unique_ptr<T>(...)
显然如果function_that_can_throw
实际上抛出然后你泄漏。make_unique
防止这种情况发生。
当然,第二次分配(如您的问题)只是一个特殊情况function_that_can_throw()
.
作为一般经验法则,只需使用make_unique
以便您的代码保持一致。当您需要时,它总是正确的(阅读:异常安全)unique_ptr
,并且它对性能没有任何影响,所以没有理由不使用它(而实际上not使用它会带来很多问题)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)