何时应该优先选择`shared_ptr`而不是`make_shared`?

3
正如在 C++中make_shared和常规shared_ptr的区别 的答案中所指出的,make_shared 在大多数情况下优于 shared_ptr
那么为什么C++标准同时定义了 shared_ptrmake_shared?是否存在一些情况下我应该使用 shared_ptr 而不是 make_shared,或者甚至只能使用 shared_ptr 而不能使用 make_shared
2个回答

5
有一种情况是,std::make_shared不支持指定自定义删除器。

std::shared_ptr的构造函数不同,std::make_shared不允许使用自定义删除器。

你只能通过std::shared_ptr的构造函数来实现,例如:
std::shared_ptr<Foo> sh5(new Foo, [](auto p) {
   std::cout << "Call delete from lambda...\n";
   delete p;
});

另一个问题就像链接的帖子所解释的那样,std::make_shared 仅为控制块和指向的对象执行一次分配。这意味着在对象被销毁后,它占用的内存可能不会立即被释放。这可能会引起一些内存使用问题。


2
如果你使用私有构造函数声明类(单例模式),你就不能使用make_shared来构造它,但可以使用shared_ptr转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接