我什么时候应该选择"shared_ptr"而不是"make_shared"?

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

本文关键字:quot shared make ptr 什么时候 选择      更新时间:2023-10-16

正如C++中对make_shared和正常shared_ptr差异的回答所指出的那样,在大多数情况下,make_shared的表现优于shared_ptr

那么C++为什么标准同时定义了shared_ptrmake_shared呢?有没有我更喜欢shared_ptr而不是make_shared的情况,甚至我只能使用shared_ptr而不能使用make_shared

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

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