std :: shared_ptrs的自定义删除器

时间:2013-10-25 21:31:50

标签: c++ shared-ptr smart-pointers

在不使用std::shared_ptr的情况下创建new后是否可以使用自定义删除工具?

我的问题是对象创建是由工厂类及其构造函数&amp ;;析构函数受到保护,这会产生编译错误,我不想使用new因为它有缺点。

详细说明:我更喜欢创建像这样的共享指针,这不允许你设置自定义删除器(我认为):

auto sp1 = make_shared<Song>(L"The Beatles", L"Im Happy Just to Dance With You");

或者我可以像这样创建它们,让met遇到通过参数设置删除:

auto sp2(new Song, MyDeleterFunc);

但第二个使用new,其中AFAIK效率不如最高级别的分配。

也许这更清楚:是否有可能获得make_shared<>以及自定义删除器的好处?这是否意味着必须编写分配器?

2 个答案:

答案 0 :(得分:8)

不,没有std::make_shared形式的自定义删除器。

如果您需要使用自定义删除工具返回shared_ptr,那么您将不得不降低性能。

考虑一下:如果您使用make_shared,那么它将分配一个更大的内存区域,可以将引用计数和您的对象存储在一起,并且将调用placement new。从shared_ptr返回的make_shared已经有一个自定义删除器,一个可以显式调用对象的析构函数,然后释放更大的内存块。

答案 1 :(得分:4)

您必须在{1}}的设计中使用new以避免额外分配,只有在std::make_shared可以使用拥有时才能使用({1}}内部)自定义删除器释放对象的内存和std::make_shared

你必须接受使用自己的自定义删除器,你无法优化分配,但你仍然应该使用shared_count之类的包装来封装std::make_shared,以便安全使用。这有助于避免在对象的构造函数抛出异常而某人使用

的情况下发生内存泄漏
new

而不是

template<typename T>
void f(const T&, const T&);

f( std::shared_ptr<X>(new X), std::shared_ptr<X>(new X) ); // possible leak