I came across this post and one of the answers by @kerek SB states
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo"));
In your code, the second variable is just a naked pointer, not a shared pointer at all.
Now on the meat. make_shared is (in practice) more efficient, because it allocates the reference control block together with the actual object in one single dynamic allocation. By contrast, the constructor for shared_ptr that takes a naked object pointer must allocate another dynamic variable for the reference count. The trade-off is that make_shared (or its cousin allocate_shared) does not allow you to specify a custom deleter, since the allocation is performed by the allocator.
(This does not affect the construction of the object itself. From Object's perspective there is no difference between the two versions. What's more efficient is the shared pointer itself, not the managed object.)
Now I have two questions regarding this post and would appreciate it if someone could clarify this
Why is the second one not a shared pointer ? Will that not increment a reference count
How does make_shared only make one memory allocation and new makes two thus making make_shared more efficent ?
A little clarification on this would be appreciated.
new Object("foo")
is evaluated first, and independently, creating a block which doesn't know it's going to be managed by a shared pointer, and thus doesn't have size for the reference count. – Neogene