gpt4 book ai didi

c++ - 更改指向 unique_ptr 的变量

转载 作者:行者123 更新时间:2023-11-30 01:34:09 26 4
gpt4 key购买 nike

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

看看这个 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 的值变化。然而,这种情况并非如此。我怎样才能做到这一点?

最佳答案

p1Ptr实际上并不指向对象 p1 .它指向由 std::make_unique 创建的未命名对象使用构造函数 P(P&&) .

std::unique_ptr<T> 没有意义指向功能 block 局部定义的对象。 unique_ptr的全部原因是它是它以某种方式指向的对象的唯一所有者。由于您使用的是默认删除器,因此该所有权意味着 unique_ptrdelete指向其对象的指针,试图结束其生命周期。但是函数局部对象的生命周期已经被函数 block “拥有”,并且在执行离开该 block 时将自动销毁;它对 delete 无效指向此类对象的指针。

关于c++ - 更改指向 unique_ptr 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56852034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com