我遇到了这篇文章和@kerek SB 的答案之一
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 更有效?
对此稍作澄清将不胜感激。