在代码审查期间,我发现期望unique_ptr的C ++函数通过std :: move传递uniqe_ptr,但函数也没有将unique_ptr作为返回值移动,也没有将调用者返回unique_ptr返回给它#s; s 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));
//...
}
所以我想知道这段代码是否正常,或者它是否只是运气。
[编辑]:完成了示例
答案 0 :(得分:2)
在这个片段中:
fun(std::move(p));
fun(std::move(p));
移动了 p
,使其为空。所以第二次调用fun()
时,它会收到一个空指针。哪个好,只要它不取消引用那个指针。
答案 1 :(得分:0)
在我看来,我的目的是像这样打电话给fun
:
p = fun(std::move(p));
p = fun(std::move(p));
在这种情况下,p
的所有权将来回传递给函数。我宁愿将fun
设为空函数,并通过引用或{* 1}}类型传递p
。