3

正如对 C++ 中 make_shared 和普通 shared_ptr 差异的答案中所指出的那样,在大多数情况下都make_shared表现出色。shared_ptr

那么为什么 C++ 标准同时定义了这shared_ptr两者make_shared?有没有我更喜欢shared_ptr甚至make_shared只能使用shared_ptr但不能使用的情况make_shared

4

2 回答 2

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

于 2017-07-17T03:37:25.807 回答
2

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

于 2017-07-17T03:35:58.517 回答