如何将 std::unique_ptr 初始化为引用
How do you initialise a std::unique_ptr to a reference
使用原始指针我可以做到:
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
分配的对象的指针,并且当 unique_ptr
超出范围时将 delete
该对象。您不能使 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
使用原始指针我可以做到:
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
分配的对象的指针,并且当 unique_ptr
超出范围时将 delete
该对象。您不能使 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