创建对象后创建shared_ptr

时间:2013-11-28 13:40:24

标签: c++ stack heap shared-ptr

之间是否存在差异:

Foo *foo = new Foo();
shared_ptr<Foo> sp(foo);
_fooVector.push_back(sp);

shared_ptr<Foo> sp(new Foo());
_fooVector.push_back(sp);

根据堆栈和堆。在所有示例中,我都可以发现new用于创建智能指针的同一行。所以我想知道第一个例子是否有效。

3 个答案:

答案 0 :(得分:6)

第一个示例如果有效,但使用make_shared更加安全且正确。

shared_ptr<Foo> sp = make_shared<Foo>();

在你的第一个例子中 - 你分配内存,用这个内存初始化指针,创建shared_pointer(shared_ptr现在拥有内存),然后将copy复制到vector。 在第二个示例中 - 您分配内存,使用此内存初始化shared_ptr c-tor的参数,然后如第一个示例所示。

答案 1 :(得分:3)

  

根据堆栈和堆

是否存在差异?

两者都使用堆的相同用途:一个用于Foo对象的分配,一个用于共享计数器。 (假设shared_ptr)的典型实现

在第一种情况下,foo持续到代码块结束,而在第二种情况下,临时指针只持续到声明结束。所以原则上,第二个比第一个使用更少的堆栈;但在实践中,两者都应该被优化为(或多或少)相同。

最好是

_fooVector.push_back(std::make_shared<Foo>());

因为只需要为Foo对象和共享计数进行单个堆分配。

  

所以我想知道第一个例子是否有效。

是的,这是有效的 - 您可以使用任何合适的指针初始化共享指针。由于两个原因,它有点危险:原始指针可用于滥用,并且在将其指定给智能指针之前可以执行其他操作,从而可能导致泄漏。直接从new表达式初始化可以修复第一个危险,但不一定是第二个危险。使用make_shared修复了两者。

答案 2 :(得分:-1)

从:http://www.cplusplus.com/reference/memory/shared_ptr/shared_ptr/

我们允许的第三个构造函数是: 来自指针(3)template <class U> explicit shared_ptr (U* p);

所以是的,第一个例子是有效的。

相关问题