澄清一下,使用 make_unique
仅在表达式中有多个分配时才增加异常安全性,而不仅仅是一个,对吗?例如
void f(T*);
f(new T);
是完全异常安全的(就分配和东西而言),而
void f(T*, T*);
f(new T, new T);
不是,对吗?
最佳答案
不仅当你有多个分配时,而且当你可以在不同的地方 throw 时。考虑一下:
f(make_unique<T>(), function_that_can_throw());
对比:
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
时,它总是正确的(阅读:异常安全) ,并且它对性能没有任何影响,因此没有理由不使用它(实际上不使用它会引入很多陷阱)。
关于c++ - 异常安全和 make_unique,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19472550/