在构造对象时是否有任何理由不使用std :: make_shared?

Ale*_*x B 15 c++

我想不出任何情况

std::shared_ptr<Object> obj(new Object("foo", 1));
Run Code Online (Sandbox Code Playgroud)

会优先考虑

auto obj = std::make_shared<Object>("foo", 1);
Run Code Online (Sandbox Code Playgroud)

后者总是会产生更好的局部性并减少内存碎片.是否有任何情况,您希望(或被迫)使用第一种形式,除了与返回原始指针的代码接口?

Jam*_*lis 18

后者总是会产生更好的局部性并减少内存碎片.

总是.鼓励实现对引用计数对象和引用计数使用单个分配,但不要求这样做.

你为什么不想用std::make_shared?考虑这样一种情况:你有一个你想拥有的大型动态分配对象,std::shared_ptr并且你知道对这个对象的弱引用可能比对象的强引用更长(可能有许多弱引用,只有一个或者两个短命的强引用).

在这种情况下,std::make_shared假设它分配一个拥有对象和引用计数的单个块,那将是一个糟糕的选择:分配的块(很大,记住)不能被销毁,直到没有强或弱的引用留给宾语.

如果您自己动态分配对象并将指针传递给std::shared_ptr构造函数,则只要没有强引用,即使仍有弱引用,也可以释放对象占用的内存.