如何将地址保存到 smart_ptr

How to save an address to a smart_ptr

我想问一下,我们可以用指针来做。

int q = 10;
int* p = &q;

如何使用 shared_ptr 做某事?我可以在这里使用 make_shared<> 吗?

shared_ptr<int> r = make_shared<int>(q);

这是正确的吗?

智能指针的意义在于巧妙地维护它们的记忆。在您的情况下 q 位于堆栈上。如果你将它传递给一个智能指针,那么当它不再被引用时它就会被删除。这将使您的程序崩溃,因为您无法删除堆栈上的内存。想要这样做也有点愚蠢,因为无论如何 q 超出范围时它都会被释放。

不,不是。智能指针在这里用于保证删除它环绕的指针(句柄)。在您的示例中,您只需获取本地堆栈变量的地址。删除这样的变量是未定义的行为(您的应用程序大多数时候会崩溃)。

但是如果您的实际代码不同,并且您确实想在 shared_ptr 中保留现有指针(稍后可以删除),您应该执行以下操作:

shared_ptr<int> r{q};

make_shared 作为创建 shared_ptr 将参数传递给指针将要指向的对象的助手存在。

如果你想要一个拥有指针的shared_ptr,直接使用构造函数:

std::shared_ptr<int> r(some_pointer_to_int);

如果您想要 shared_ptr 指向给定对象的副本,请使用 make_shared:

auto r = std::make_shared<int>(some_int);

请注意,如果指针指向具有自动存储持续时间的对象,则前者将不正确。此类对象由运行时管理。

make_shared<>() 将参数传递给构造函数。

shared_ptr<int> r = make_shared<int>(q);

这会构造一个指向单个 int 的共享点,该点与 q 具有相同的值。

如果你想将指针分配给共享指针,你可以这样做:

shared_ptr<int> r = q;

话虽这么说,但您的具体示例毫无意义。当共享指针超出范围时,它将调用 delete 堆栈分配的变量,并调用未定义的行为。

没有任何使用信息,它取决于生命周期。如果你只需要在一个函数中使用它,你最好有一个参考。

auto& r = *q;

如果你必须得到一个指针类型你可以这样做

auto& r = q;