什么时候我应该更喜欢`shared_ptr`到'make_shared`?

时间:2017-07-17 03:33:01

标签: c++ c++11 shared-ptr make-shared

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

那么为什么C ++标准一起定义shared_ptrmake_shared?在任何情况下我都应该选择shared_ptrmake_shared,甚至我只能使用shared_ptr而不是make_shared

2 个答案:

答案 0 :(得分: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只对控制块和指向的对象执行一次分配。这意味着在对象被销毁之后,它占用的内存可能不会立即被释放。这可能会导致一些内存使用问题。

答案 1 :(得分:2)

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