为何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
相关产品推荐
相关产品推荐

