正如Difference in make_shared and normal shared_ptr in C++的答案所指出的那样,make_shared
在大多数情况下都优于shared_ptr
。
那么为什么C ++标准一起定义shared_ptr
和make_shared
?在任何情况下我都应该选择shared_ptr
到make_shared
,甚至我只能使用shared_ptr
而不是make_shared
?
答案 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
强制转换。