【发布时间】:2016-05-22 17:45:24
【问题描述】:
事后看来,给定make_shared,如果 C++11 引入了 shared_ptr,它是否会有一个采用原始指针的构造函数?
是否有支持这个构造函数的有力论据或用例?
它可以避免 exception-safety 和 memory allocation/performance advantage 使用 make_shared 的有据可查的陷阱。
我相信通过make_shared 要求shared_ptr 构造的另一个优点是它可以是引擎盖下的单个指针,降低其内存使用并使atomic_compare_exchange 之类的东西更简单(并且可能更有效) . (见presentation from C++Now)
我了解基本上是 intrusive_ptr(对象和控制块合并)的 shared_ptr 将缺少当前 std::shared_ptr 具有的功能。喜欢:
-
将对象与控制块分开释放的能力(如果您长期使用weak_ptrs,这很好)
-
与提供原始指针的库的兼容性以及释放它们的责任
-
使用自定义删除器(或无删除器,对于非拥有指针)保存任意资源的能力
-
在保持父对象活动的同时指向子对象(例如成员)的能力。
我的建议是,这些功能可能不够常用(或者在将其用作RAII-wrapper 的情况下)可能不是最合适的,以保证额外的成本:
- 指向控制块的单独指针
- (可能)更复杂的 atomic_compare_exchange 逻辑,可能不值得。
在C++98 世界中(引入了 shared_ptr),make_shared 不太实用且对用户不太友好(缺少完美的转发需要引用包装器,并且缺少可变参数模板使得实现笨拙)。
【问题讨论】:
-
如果您无法控制对象构造怎么办? (假设您正在管理 C 库中的资源。)
-
make_shared是在 C++11 中引入的。 -
@NicolBolas 对,shared_ptr 是在 C++03 中引入的
-
@Arvid 不,不是
标签: c++ c++11 shared-ptr make-shared