唯一指针与原始指针

时间:2018-12-30 11:32:57

标签: c++ unique-ptr

试图了解unique_pointer与原始指针访问

#include <iostream>
#include <memory>

int main() {
    int a = 10;
    int *x = &a;
    int *y = &a;
    std::unique_ptr<int> p1 = std::make_unique<int>(a);
    std::cout<<*x<<*p1<<*y<<"\n";
    // prints 101010
    *p1 = 20;
    std::cout<<*x<<*p1<<*y<<"\n";
    // prints 102010
    *x =30;
    std::cout<<*x<<*p1<<*y<<"\n";
    // 302030
    return 0;
}

输出

101010
102010
302030

Program ended with exit code: 0

在上面的代码x,y,p1中都指向变量a; 因此,值a的更改应该已经反映到所有取消引用的指针。

请帮我了解一下行为,我是少数几个人,他们现在都从使用原始指针转移到了智能指针。

2 个答案:

答案 0 :(得分:5)

您错了,p1并不指向a

代替std::make_unique<int>(a)创建一个全新的int对象,并将其初始化为a的当前


要使p1指向a,您需要做

std::unique_ptr<int> p1(&a);

但这带来了其他问题,例如p1接管&a所有权,并在p1被破坏时尝试释放该内存(这是不可能的。)

您可以使用the Boost null_deleter来避免最后一个问题。

但是我建议在大多数情况下,您不应该将智能指针看作简单的自删除指针,而应该从所有权角度来看。

答案 1 :(得分:1)

原因

  • std::make_unique()让您创建新对象,而不引用该参数
    • 您会发现unique_ptr获得了不同的地址:screenshot

解决方案

  • 正如Some programmer dude所说,请使用std::unique_ptr<int> p1(&a);
    • 这导致unique_ptr指示相同的地址:screenshot