问题描述
使用原始指针我可以做到:
int x = 10;
int* y = &x;
x = 20;
std::cout << *y; //prints 20
但是,我很难用 std::unique_ptr
模仿相同的行为。我试过了:
int x = 10;
std::unique_ptr<int> y = std::make_unique(&x); //doesnt compile
std::unique_ptr<int> y = std::make_unique<int>(&x); //doesnt compile
std::unique_ptr<int&> y = std::make_unique(x); //doesnt compile
std::unique_ptr<int> y = std::make_unique<int&>(&x); //doesnt compile
std::unique_ptr<int> y = std::make_unique<int>(x); //compiles but prints y = 10,which is not the desired behavIoUr
我确定有办法,所以感谢您的帮助。谢谢。
解决方法
unique_ptr
是关于管理动态分配内存的生命周期。
也就是说
std::unique_ptr<int> y = std::make_unique<int>(x);
说为一个整数分配内存,复制 x 的值到其中,当 y 超出范围时,请释放该内存。
在您的示例中,您对管理已分配存储的生命周期不感兴趣,您只需要另一个“视图”来了解为 x 存储的内容。这不是 unique_ptr
的设计目的。
第一个代码中没有动态分配,所以根本不需要尝试用 unique_ptr
来模拟它。
unique_ptr
管理一个指向用 new
分配的对象的指针,并且当 delete
超出范围时将 unique_ptr
该对象。您不能将 unique_ptr
用作对其不拥有的外部对象的引用。
话虽如此,如果您确实希望两个智能指针指向内存中的同一个对象,则使用 shared_ptr
而不是 unique_ptr
,例如:
#include <memory>
auto x = std::make_shared<int>(10);
auto y = x;
*x = 20;
std::cout << *y; //prints 20