【发布时间】:2018-05-28 12:00:56
【问题描述】:
在代码审查期间,我发现一个期望 unique_ptr 的 C++ 函数通过 std::move 传递给 uniqe_ptr,但该函数既没有将 unique_ptr 作为返回值移动,也没有将返回的 unique_ptr 分配回调用者的 unique_ptr,所以我预计这会崩溃。
例子:
std::unique_ptr<X> fun(std::unique_ptr<X> p) {
// Do something with the unique_ptr p
return p;
}
在其他地方,我发现了以下调用:
void someFunction() {
auto p = std::make_unique<X>();
//...
fun(std::move(p));
// Do something else
fun(std::move(p));
//...
}
所以我想知道这段代码是否正常,或者它执行是否只是运气。
[编辑]:完成示例
【问题讨论】:
-
你是说
p被移动了两次? -
@JohnZwinck:是的,它实际上移动了两次(我将示例扩展得更清楚)
-
执行两次
std::move(p)不是问题。第一个std::move会将unique_ptr设置为nullptr,因此第二个fun(std::move(p))应该将nullptr传递给您的函数。
标签: c++11 unique-ptr