更改指向unique_ptr的变量
Changing pointed to variable of unique_ptr
我不认为我正确理解了智能指针的概念。
看这个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>
点是没有意义的。unique_ptr
的全部原因是它是它指向对象的单个所有者。由于您使用的是默认的deleter,因此所有权意味着unique_ptr
将delete
指向其对象的指针,并试图终止其生命周期。但是函数本地对象已经具有其寿命由功能块"拥有",并且当执行离开该块时会自动销毁;delete
指向此对象无效。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- CLANG 编译器 说:变量"PTR"可能未初始化
- int *ptr = &var 和 int *ptr 之间的区别;*PTR = 和变量?
- 如果您使一个char*ptr存储整数变量的地址,会发生什么
- void(**vt)()=*(void(***)())ptr;c++中虚拟表的辅助变量