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
的构造/销毁职责