【发布时间】:2017-01-20 02:05:13
【问题描述】:
是否可以同时为std::shared_ptr 使用自定义分配器和自定义删除器?在我看来,没有办法这样做,因为std::allocate_shared 不需要删除器。而且,删除器的唯一合理签名应该是 void deleter(T*, const Alloc&),而不仅仅是 void deleter(T*)。
有没有办法解决这个限制?
【问题讨论】:
是否可以同时为std::shared_ptr 使用自定义分配器和自定义删除器?在我看来,没有办法这样做,因为std::allocate_shared 不需要删除器。而且,删除器的唯一合理签名应该是 void deleter(T*, const Alloc&),而不仅仅是 void deleter(T*)。
有没有办法解决这个限制?
【问题讨论】:
是的,您可以这样做,但请确保您了解发生了什么。删除器的目的是销毁对象。分配器用于内部簿记结构。
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,这是有道理的。
【讨论】:
您可以使用单独的分配器和删除器;有shared_ptr 构造函数同时接受两者。
但是你不能通过allocate_shared做到这一点。原因是分配器用于分配/解除分配共享存储。删除器用于销毁被管理的对象并释放其存储空间。
由于allocate_shared 将在同一存储中管理的对象分配为共享存储本身,因此将这两个操作分开不再有意义。因此,您必须对两个进程使用相同的对象。分配器分配和释放单个分配,它负责创建和销毁 T 的构造/销毁职责。
【讨论】: