shared_ptr自定义分配器以及自定义删除器

时间:2017-01-19 17:55:40

标签: c++ c++11

std::shared_ptr是否可以同时使用自定义分配器和自定义删除器?在我看来,没有办法这样做,因为std::allocate_shared没有删除。此外,删除器唯一明智的签名就像void deleter(T*, const Alloc&),而不仅仅是void deleter(T*)

有没有办法解决这个限制?

2 个答案:

答案 0 :(得分:3)

是的,你可以这样做,但要确保你明白发生了什么。删除者的目的是破坏对象。分配器用于内部簿记结构。

std::shared_ptr<T> sp(new T(args...), std::default_delete<T>(), myalloc);

make_sharedallocate_shared的重点是他们负责为您构建对象,因此您不指定删除者 - 他们使用自己的删除者这适合于他们获取资源的方式(即分别通过operator new和提供的分配器)。

您当然可以创建自己的分配器删除器(如this oneproposed here)以传入上述构造函数以与分配器分配的对象一起使用,然后还可以使用分配器(或另一个!)用于簿记。

在你有长寿命的弱指针或二进制大小很重要的情况下,没有使用make_shared / allocate_shared可以说些什么。

答案 1 :(得分:1)

您可以使用单独的分配器和删除器;有两个shared_ptr构造函数。

但你无法通过allocate_shared执行此操作。原因是分配器用于分配/解除分配共享存储。删除器用于销毁正在管理的对象并释放其存储空间。

由于allocate_shared同一存储中管理的对象分配为共享存储本身,因此将两个操作分开不再有意义。因此,您必须对两个进程使用相同的对象。分配器分配和释放单个分配,它负责创建和销毁T的构造/销毁职责。