在不使用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<>
以及自定义删除器的好处?这是否意味着必须编写分配器?
答案 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