2015-05-07 24 views
-1

我想问我们可以用指针做什么。如何将地址保存到smart_ptr

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

如何用shared_ptr做些什么?我可以在这里使用make_shared <>吗?

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

这是正确的吗?

+1

如果'q'是一个局部变量,你应该小心,因为局部变量往往超出范围。如果它是一个全局变量,为什么你需要一个智能指针?事实上,为什么你需要一个聪明的指针呢,你的用例是什么?这对我来说没有任何意义。 –

+0

请记住'make_shared (xs ...)'用'xs ...'调用'T'的构造函数。在你的情况下,'r'是一个共享指针,指向一个值为10的堆分配对象。 – mavam

+0

这个问题对我没有意义。我看过答案,但它仍然没有意义。 Downvoting。 –

回答

0

如果你想有一个shared_ptr拥有一个指针,直接使用构造函数:如果你想有一个shared_ptr指向给定对象的副本

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

,使用make_shared

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

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

+0

因此,如果我有一个局部变量,并且我想将其副本的地址保存到另一个指针是一个私有变量,那么第二种方法会好吗? –

+0

@tariqzafar是的,局部变量将被复制到某个具有动态存储持续时间的对象中,您将得到一个指向该副本的'shared_ptr',并且当指向它的所有'shared_ptr'都指向它时,副本将自动销毁销毁。 – Brian

0

智能指针的目的是巧妙地保持其记忆。在你的情况下,q位于堆栈上。如果你将它传递给一个智能指针,那么当它不再被引用时它将被删除。这会使您的程序崩溃,因为您无法删除堆栈中的内存。无论如何,当q超出范围时,它也会被释放,这也是一种愚蠢的想法。

1

不,它不是。智能指针在这里用于保证删除指针(句柄)的周围。在你的例子中,你只需要获得本地堆栈变量的地址。删除这样一个变量是未定义的行为(您的应用程序将在大部分时间崩溃)。

但是如果你的实际代码是不同的,你真的想保持现有的指针(这是确定后删除)在shared_ptr,你应该做到以下几点:

shared_ptr<int> r{q}; 

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

0

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

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

此构造一个共享点到单个int保持相同的值q

如果你想一个指针分配给共享指针,你会做这样的事情:

shared_ptr<int> r = q; 

话虽这么说,你的具体的例子是没有意义的。当共享指针超出作用域时,它将调用堆栈分配变量的delete,并调用未定义的行为。

0

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

auto& r = *q; 

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

auto& r = q;