之间是否存在差异:
Foo *foo = new Foo();
shared_ptr<Foo> sp(foo);
_fooVector.push_back(sp);
和
shared_ptr<Foo> sp(new Foo());
_fooVector.push_back(sp);
根据堆栈和堆。在所有示例中,我都可以发现new
用于创建智能指针的同一行。所以我想知道第一个例子是否有效。
答案 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);
所以是的,第一个例子是有效的。