从C++ 11开始,由于几个原因,开发人员倾向于将智能指针类用于动态生命周期对象.而对于那些新的智能指针类,标准,甚至建议不使用运营商,new
而是建议使用make_shared
或make_unique
避免一些容易出错.
如果我们喜欢使用智能指针类shared_ptr
,我们可以构建一个类似的,
shared_ptrp(new int(12));
我们还希望将自定义删除器传递给智能指针类,
shared_ptrp(new int(12), deleter);
另一方面,如果我们喜欢使用make_shared
分配,例如.int
,而不是使用new
和shared_ptr
构造函数,就像上面的第一个表达式,我们可以使用
auto ip = make_shared(12);
但是,如果我们也希望将自定义删除器传递给make_shared
,那么有没有正确的方法呢?好像编译器,至少gcc,给出错误,
auto ip = make_shared(12, deleter);
Nicol Bolas.. 52
正如其他人所说,make_shared
不能与自定义删除器一起使用.但我想解释原因.
存在自定义删除器是因为您以某种特殊方式分配了指针,因此您需要能够以相应的特殊方式释放它.好吧,make_shared
分配指针new
.分配的对象new
应该被释放delete
.标准删除者尽职尽责.
简而言之,如果您可以使用默认的分配行为,那么您也可以使用默认的释放行为.如果您不能使用默认分配行为,则应使用allocate_shared
,它使用提供的分配器来分配和取消分配存储.
此外,make_shared
允许(并且几乎肯定会)T
在同一分配中为shared_ptr 分配内存和控制块.这是你的删除者无法真正了解或处理的事情.鉴于allocate_shared
您提供的分配器可以执行分配和解除分配任务,因此能够处理它.
正如其他人所说,make_shared
不能与自定义删除器一起使用.但我想解释原因.
存在自定义删除器是因为您以某种特殊方式分配了指针,因此您需要能够以相应的特殊方式释放它.好吧,make_shared
分配指针new
.分配的对象new
应该被释放delete
.标准删除者尽职尽责.
简而言之,如果您可以使用默认的分配行为,那么您也可以使用默认的释放行为.如果您不能使用默认分配行为,则应使用allocate_shared
,它使用提供的分配器来分配和取消分配存储.
此外,make_shared
允许(并且几乎肯定会)T
在同一分配中为shared_ptr 分配内存和控制块.这是你的删除者无法真正了解或处理的事情.鉴于allocate_shared
您提供的分配器可以执行分配和解除分配任务,因此能够处理它.
从文档中,make_shared
接受一个参数列表,用于构造T的实例.
此外,文件说:
此函数通常用于从调用new返回的原始指针替换共享指针的构造std :: shared_ptr(new T(args ...)).
因此,您可以推断出无法设置自定义删除器.
要做到这一点,你必须shared_ptr
通过正确的构造函数为自己创建.
作为建议列表中构造函数的示例,您可以使用:
template< class Y, class Deleter > shared_ptr( Y* ptr, Deleter d );
因此,代码将是这样的:
auto ptr = std::shared_ptr(new MyClass{arg1, arg2}, myDeleter);
代替:
auto ptr = std::make_shared(arg1, arg2);