如何将地址保存到 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;
我想问一下,我们可以用指针来做。
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;