试图了解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的更改应该已经反映到所有取消引用的指针。
请帮我了解一下行为,我是少数几个人,他们现在都从使用原始指针转移到了智能指针。
答案 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()
让您创建新对象,而不引用该参数
Some programmer dude
所说,请使用std::unique_ptr<int> p1(&a);