正如对 C++ 中 make_shared 和普通 shared_ptr 差异的答案中所指出的那样,在大多数情况下都make_shared
表现出色。shared_ptr
那么为什么 C++ 标准同时定义了这shared_ptr
两者make_shared
?有没有我更喜欢shared_ptr
甚至make_shared
只能使用shared_ptr
但不能使用的情况make_shared
?
正如对 C++ 中 make_shared 和普通 shared_ptr 差异的答案中所指出的那样,在大多数情况下都make_shared
表现出色。shared_ptr
那么为什么 C++ 标准同时定义了这shared_ptr
两者make_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
。