std::shared_ptrs 的自定义删除器

2024-01-10

创建后是否可以使用自定义删除器std::shared_ptr不使用new?

我的问题是对象创建是由工厂类处理的,并且它的构造函数和析构函数受到保护,这会产生编译错误,我不想使用new因为它的缺点。

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

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

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

auto sp2(new Song, MyDeleterFunc);

但第二个使用new,据我所知,它不如顶级分配那么有效。

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


不,没有任何形式std::make_shared http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared这需要一个自定义删除器。

如果您需要退回shared_ptr如果使用自定义删除器,那么您将不得不承受性能损失。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::shared_ptrs 的自定义删除器 的相关文章

随机推荐