什么时候我应该更喜欢 `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_ptr
和make_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
只为控制块和指向的对象执行一次分配。这意味着对象被销毁后,它占用的内存可能不会立即释放。这可能会导致一些内存使用问题。
正如对 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
?
如果您使用私有构造函数(单例模式)声明 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
只为控制块和指向的对象执行一次分配。这意味着对象被销毁后,它占用的内存可能不会立即释放。这可能会导致一些内存使用问题。