如何将 std::unique_ptr 初始化为引用

问题描述

使用原始指针我可以做到:

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

Demo