You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何std::move传递unique_ptr&&后原指针未空?及reset()作用解析

问题解答

1. 为什么std::move(g)后g没有变为nullptr?

你的pass_unique_by_move函数只是接收了unique_ptr的右值引用,但函数内部并没有执行所有权转移操作。std::move本身只是把左值转换为右值引用的“标记”,它不会主动转移所有权——所有权转移必须通过unique_ptr的移动构造或移动赋值来触发。

你这个函数里只做了*T = 9(修改指针指向的内容),完全没触碰T的所有权状态。原指针g的所有权没被夺走,自然不会变成nullptr。

如果要让函数获取所有权,需要在函数内部把这个右值引用的unique_ptr转移到另一个对象中,比如:

void pass_unique_by_move(std::unique_ptr<int> &&T) {
    std::unique_ptr<int> local = std::move(T); // 此处完成所有权转移,T会被置空,对应原g也变为nullptr
    *local = 9;
}

2. 示例函数中调用reset()的作用是什么?

std::unique_ptr::reset()的核心作用是释放当前指针指向的内存资源,同时将unique_ptr本身置为nullptr(不带参数时)。

在接收unique_ptr&&的函数里调用reset(),通常有两种场景:

  • 函数获取所有权后,不再需要保留资源,直接调用reset()释放内存,避免资源泄漏;
  • 用来演示“获取所有权后主动放弃资源”的行为,明确让指针置空,同时释放底层内存。

另外补充:你代码里第二个assert(g == nullptr)本身存在错误——pass_unique_by_ref是传递左值引用,函数仅修改指针指向的内容,所有权完全未发生转移,g根本不会是nullptr,这个断言原本就会触发失败。


内容的提问来源于stack exchange,提问作者Lord Feistel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:25:22