更改指向unique_ptr的变量

时间:2019-07-02 12:02:40

标签: c++ smart-pointers

我认为我没有正确理解智能指针的概念。

看看这个MWE:

// Example program
#include <iostream>
#include <memory>
#include <string>

struct P{
    float x, y;
    P() : x(0.f), y(0.f){}
    P(float x, float y) : x(x), y(y){}
    P(P&& q) : x(q.x), y(q.y){}
    P& operator=(P&& q){
        x = q.x;
        y = q.y;
        return *this;
    }
    P& operator=(const P&) = delete;
    P(const P&) = delete;

};

std::ostream& operator<<(std::ostream& out, const P& p){ out << p.x << " / " << p.y; return out;}

int main(){    
    P p1{1.f, 0.f};
    P p2{2.f, 0.f};

    std::unique_ptr<P> p1Ptr(std::make_unique<P>(std::move(p1)));
    P* p2Ptr = &p2;

    p1 = std::move(P{1.f, 1.f});
    p2 = std::move(P{2.f, 2.f});

    std::cout << " p1: " << p1 << "\n";
    std::cout << "*p1: " << *p1Ptr << "\n";
    std::cout << "*p1: " << *(p1Ptr.get()) << "\n";
    std::cout << " p2: " << p2 << "\n";
    std::cout << "*p2: " << *p2Ptr << std::endl; 
}

输出:

  

p1:1/1
  * p1:1/0
  * p1:1/0
  p2:2/2
  * p2:2/2

我希望std::unique_ptr也会看到p1的值变化。然而,这种情况并非如此。我该如何实现?

1 个答案:

答案 0 :(得分:4)

oauth: resource_owners: azure: azure_login login_path: fos_user_security_login 实际上并不指向对象p1Ptr。它指向p1使用构造函数std::make_unique创建的未命名对象。

在功能块本地定义的对象上有P(P&&)点是没有意义的。 std::unique_ptr<T>的全部原因是它是它所指向的对象的单一所有者。由于您使用的是默认删除程序,因此该所有权意味着unique_ptrunique_ptr指向其对象的指针,试图结束其生命周期。但是功能本地对象的生命周期已经被功能块“拥有”,当执行离开该功能块时,该对象将被自动销毁。 delete指向此类对象的指针无效。