C++ 共享\u ptr自定义分配器和自定义删除器

C++ 共享\u ptr自定义分配器和自定义删除器,c++,c++11,C++,C++11,对于std::shared\u ptr,是否可以同时使用自定义分配器和自定义删除器?在我看来,这是没有办法的,因为std::allocate\u shared不接受删除程序。而且,删除器的唯一合理签名是类似于void deleter(T*,const Alloc&),而不仅仅是void deleter(T*) 有没有办法克服这个限制?是的,你可以这样做,但要确保你了解发生了什么。删除者的目的是销毁对象。分配器用于内部簿记结构 std::shared_ptr<T> sp(new T(a

对于
std::shared\u ptr
,是否可以同时使用自定义分配器和自定义删除器?在我看来,这是没有办法的,因为
std::allocate\u shared
不接受删除程序。而且,删除器的唯一合理签名是类似于
void deleter(T*,const Alloc&)
,而不仅仅是
void deleter(T*)


有没有办法克服这个限制?

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

std::shared_ptr<T> sp(new T(args...), std::default_delete<T>(), myalloc);
std::shared_ptr sp(新的T(args…),std::default_delete(),myalloc);
make_shared
allocate_shared
的要点是,它们负责为您构建对象,因此您不指定删除器-它们使用自己的删除器,该删除器适合于它们获取资源的方式(即分别通过
operator new
和提供的分配器)

当然,您可以创建自己的分配器deleter(like或one),将其传递到上面的构造函数中,与分配器分配的对象一起使用,然后还可以使用分配器(或另一个分配器!)进行簿记


在存在长期存在的弱点或二进制大小很重要的情况下,不使用
make_shared
/
allocate_shared

可以使用单独的分配器和删除器;有
shared\u ptr
构造函数同时使用这两种方法

但您不能通过
分配\u shared
来实现这一点。原因是分配器用于分配/取消分配共享存储。删除器用于销毁正在管理的对象并释放其存储

由于
allocate\u shared
将要管理的对象分配到与共享存储本身相同的存储中,因此将这两个操作分开不再有意义。因此,两个进程必须使用相同的对象。分配器分配和解除分配单个分配,并负责创建和销毁的
T
的构造/销毁职责