std::shared_ptr
是否可以同时使用自定义分配器和自定义删除器?在我看来,没有办法这样做,因为std::allocate_shared
没有删除。此外,删除器唯一明智的签名就像void deleter(T*, const Alloc&)
,而不仅仅是void deleter(T*)
。
有没有办法解决这个限制?
答案 0 :(得分:3)
是的,你可以这样做,但要确保你明白发生了什么。删除者的目的是破坏对象。分配器用于内部簿记结构。
std::shared_ptr<T> sp(new T(args...), std::default_delete<T>(), myalloc);
make_shared
和allocate_shared
的重点是他们负责为您构建对象,因此您不指定删除者 - 他们使用自己的删除者这适合于他们获取资源的方式(即分别通过operator new
和提供的分配器)。
您当然可以创建自己的分配器删除器(如this one或proposed here)以传入上述构造函数以与分配器分配的对象一起使用,然后还可以使用分配器(或另一个!)用于簿记。
在你有长寿命的弱指针或二进制大小很重要的情况下,没有使用make_shared
/ allocate_shared
可以说些什么。
答案 1 :(得分:1)
您可以使用单独的分配器和删除器;有两个shared_ptr
构造函数。
但你无法通过allocate_shared
执行此操作。原因是分配器用于分配/解除分配共享存储。删除器用于销毁正在管理的对象并释放其存储空间。
由于allocate_shared
将同一存储中管理的对象分配为共享存储本身,因此将两个操作分开不再有意义。因此,您必须对两个进程使用相同的对象。分配器分配和释放单个分配,它负责创建和销毁T
的构造/销毁职责。