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

为何std::move后unique_ptr自身地址未改变?求代码问题排查

std::unique_ptr移动语义的问题排查

我正在探索std::unique_ptr的用法,运行代码后得到了不符合预期的结果,环境是Windows系统上的WSL(Windows Subsystem for Linux)。

代码

#include <iostream>
#include <memory>
using namespace std;

int main()
{
    auto revenu_ptr{make_unique<double>(1234.64)};
    cout << "Revenue ptr---------" << endl;
    cout << "Original " << &revenu_ptr << " " << *revenu_ptr<< endl;

    auto revenue_ptr_move = std::move(revenu_ptr);
    cout << "After Move " << &revenu_ptr << endl;
    cout << "Revenue_ptr_move---------" << endl;
    cout << "Moved Adderess " << &revenue_ptr_move<< endl;
    cout << "Moved Value " << *revenue_ptr_move << endl;
}

预期输出

Revenue ptr---------
Original 0x7ffd442e9618 1234.64
After Move 0x0
Revenue_ptr_move---------
Moved Adderess 0x7ffd442e9618
Moved Value 1234.64

实际输出

Revenue ptr---------
Original 0x7ffd442e9618 1234.64
After Move 0x7ffd442e9618
Revenue_ptr_move---------
Moved Adderess 0x7ffd442e9620
Moved Value 1234.64

问题原因与修正

你混淆了**unique_ptr对象自身的栈地址和它内部管理的堆内存指针**:

  • &revenu_ptr获取的是unique_ptr这个对象在栈上的存储地址,这个地址从对象创建到销毁都不会改变,std::move操作不会修改对象本身的存储位置。
  • 要查看unique_ptr管理的堆内存指针,应该调用get()方法。std::move之后,原unique_ptr内部的指针会被置为nullptr(即0x0),新的unique_ptr会接管这块堆内存的所有权。

修正后的代码

#include <iostream>
#include <memory>
using namespace std;

int main()
{
    auto revenu_ptr{make_unique<double>(1234.64)};
    cout << "Revenue ptr---------" << endl;
    // 输出内部管理的指针,而非对象自身地址
    cout << "Original " << revenu_ptr.get() << " " << *revenu_ptr<< endl;

    auto revenue_ptr_move = std::move(revenu_ptr);
    // 同样输出内部指针
    cout << "After Move " << revenu_ptr.get() << endl;
    cout << "Revenue_ptr_move---------" << endl;
    // 输出新对象的内部指针
    cout << "Moved Address " << revenue_ptr_move.get()<< endl;
    cout << "Moved Value " << *revenue_ptr_move << endl;
}

修正后的预期输出

Revenue ptr---------
Original 0x55a97c202eb0 1234.64
After Move 0x0
Revenue_ptr_move---------
Moved Address 0x55a97c202eb0
Moved Value 1234.64

内容的提问来源于stack exchange,提问作者PANKAJ LADE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:15:33