我发现了这篇文章,其中一个答案是@kerek SB说的
Run Code Online (Sandbox Code Playgroud)std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo"));在你的代码中,第二个变量只是一个裸指针,而不是一个共享指针.
现在就肉了.make_shared(实际上)更有效,因为它在一个动态分配中将引用控制块与实际对象一起分配.相比之下,采用裸对象指针的shared_ptr的构造函数必须为引用计数分配另一个动态变量.权衡是make_shared(或其表兄allocate_shared)不允许您指定自定义删除器,因为分配是由分配器执行的.
(这不会影响对象本身的构造.从Object的角度来看,两个版本之间没有区别.更有效的是共享指针本身,而不是托管对象.)
现在我对这篇文章有两个问题,如果有人能澄清一下,我会很感激
为什么第二个不是共享指针?这不会增加引用计数
make_shared如何只进行一次内存分配,而new将两次内存分配,从而使make_shared更有效率?
对此有点澄清将不胜感激.