什么时候我应该更喜欢 `shared_ptr` 而不是 `make_shared`?

When should I prefer `shared_ptr` to `make_shared`?

正如对 Difference in make_shared and normal shared_ptr in C++ 的回答所指出的,在大多数情况下 make_shared 优于 shared_ptr

那为什么C++标准把shared_ptrmake_shared定义在一起呢?在某些情况下,我应该更喜欢 shared_ptr 而不是 make_shared,甚至我只能使用 shared_ptr 而不能使用 make_shared

如果您使用私有构造函数(单例模式)声明 class,您将无法使用 make_shared 来构造它,但可以使用 shared_ptr 强制转换。

其中一种情况是std::make_shared不支持指定自定义删除器

Unlike the std::shared_ptr constructors, std::make_shared does not allow a custom deleter.

你只能用std::shared_ptr的构造函数来做,例如

std::shared_ptr<Foo> sh5(new Foo, [](auto p) {
   std::cout << "Call delete from lambda...\n";
   delete p;
});

另一个问题正如链接post所解释的那样,std::make_shared只为控制块和指向的对象执行一次分配。这意味着对象被销毁后,它占用的内存可能不会立即释放。这可能会导致一些内存使用问题。