事后看来,如果用 C++11 引入了给定的构造函数,它make_shared
会shared_ptr
接受一个原始指针吗?
是否有支持此构造函数的有力论据或用例?
它将避免有据可查的异常安全陷阱和使用.make_shared
我相信要求的另一个好处shared_ptr
我相信要求构建 viamake_shared
是它可以是引擎盖下的单个指针,从而降低其内存使用并使atomic_compare_exchange 之类的事情变得更简单(并且可能更有效)。(参见C++Now 的演示文稿)
我知道一个基本上是 intrusive_ptr(对象和控制块合并)的 shared_ptr 将缺少当前 std::shared_ptr 具有的功能。喜欢:
将对象与控制块分开释放的能力(如果您长期使用weak_ptrs,这很好)
与向您提供原始指针并负责释放它们的库的兼容性
使用自定义删除器(或没有删除器,对于非拥有指针)保存任意资源的能力
在保持父对象活动的同时指向子对象(例如,成员)的能力。
我的建议是,这些功能可能不够常用(或者在将其用作RAII包装器的情况下)可能不是最合适的,以保证额外的成本:
- 指向控制块的单独指针
- (可能)更复杂的 atomic_compare_exchange 逻辑,可能不值得。
在C++98世界中(引入了 shared_ptr),make_shared 不太实用且对用户不太友好(缺少完美的转发需要引用包装器,并且缺少可变参数模板使得实现笨拙)。