【问题标题】:When should I prefer `shared_ptr` to `make_shared`? [duplicate]什么时候我应该更喜欢 `shared_ptr` 而不是 `make_shared`? [复制]
【发布时间】:2017-12-21 11:31:42
【问题描述】:

正如Difference in make_shared and normal shared_ptr in C++ 的答案中所指出的,make_shared 在大多数情况下都优于 shared_ptr

那为什么 C++ 标准同时定义 shared_ptrmake_shared 呢?在哪些情况下我应该更喜欢shared_ptr 而不是make_shared,甚至我只能使用shared_ptr 而不能使用make_shared

【问题讨论】:

    标签: c++ c++11 shared-ptr make-shared


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2022-01-08
        • 2011-05-10
        • 2018-01-22
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 2011-04-01
        • 2015-09-10
        • 2018-02-09
        相关资源
        最近更新 更多