c++ unique_ptr的地址即使在std::move之后也不会改变

py49o6xq  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(156)

我正在探索unique_ptr。我得到错误的答案比预期的,谁能帮助我找到到底是什么错了这里的代码.我在Windows机器上使用WSL(Windows System 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;
}
Expected Output : 
Revenue ptr---------
Original 0x7ffd442e9618 1234.64
After Move 0x0
Revenue_ptr_move---------
Moved Adderess 0x7ffd442e9618
Moved Value 1234.64

但是我得到了这个错误的输出,在移动操作后,adderss应该变为零,但它指向相同的内存位置。并且新地址位于revenue_ptr_move中

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

y53ybaqx1#

&revenu_ptr是唯一ptr对象的地址。
*revenu_ptr是指向的数据。
revenu_ptr.get()是唯一ptr对象的值。
您似乎混淆了&revenu_ptrrevenu_ptr.get()
这不是一个罕见的问题。“指针的地址”与“指针的值”不同。而指针的值是 * 一个地址 * 这一事实增加了混乱!
最重要的是,指针指向的值与指针具有的值不同。
指针的值是一个地址。
指针的地址是一个地址。
指针指向的值有一个地址,它是指针的值。

[&ptr] -> [ptr.get()] -> [7]

这里我们有一个(唯一的)PTR,它指向值7。
它有一个地址--它自己存储的地址。它有一个值,这是它所指向的值7的地址。它有一个指向的值,这是一个值为7的整数。

相关问题