unique_ptr 没有移动,为什么会这样?
unique_ptr without move, why is this working?
在代码审查期间,我发现期望 unique_ptr 的 C++ 函数被 std::move 传递给 uniqe_ptr,但该函数也没有将 unique_ptr 移动为 return 值也不会将 return 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));
//...
}
所以我想知道这段代码是否可以执行,或者它是否执行只是运气。
[编辑]:完成示例
在这个片段中:
fun(std::move(p));
fun(std::move(p));
p
被移出,使其为空。所以你第二次调用 fun()
时,它接收到一个空指针。这很好,只要它不取消引用该指针即可。
在我看来,它的目的是像这样调用 fun
:
p = fun(std::move(p));
p = fun(std::move(p));
在这种情况下,p
的所有权将在函数之间来回传递。我宁愿使 fun
成为一个 void 函数并通过引用或什至作为原始 X*
类型传递 p
。
在代码审查期间,我发现期望 unique_ptr 的 C++ 函数被 std::move 传递给 uniqe_ptr,但该函数也没有将 unique_ptr 移动为 return 值也不会将 return 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));
//...
}
所以我想知道这段代码是否可以执行,或者它是否执行只是运气。
[编辑]:完成示例
在这个片段中:
fun(std::move(p));
fun(std::move(p));
p
被移出,使其为空。所以你第二次调用 fun()
时,它接收到一个空指针。这很好,只要它不取消引用该指针即可。
在我看来,它的目的是像这样调用 fun
:
p = fun(std::move(p));
p = fun(std::move(p));
在这种情况下,p
的所有权将在函数之间来回传递。我宁愿使 fun
成为一个 void 函数并通过引用或什至作为原始 X*
类型传递 p
。