使用make_shared创建shared_ptr<>指向数组并使用自定义删除器

7

是否可以使用make_shared和自定义删除器来处理shared_ptr<>指向的数组(以下是我尝试通过构造函数进行操作的方式,但我不知道如何通过使用make_shared实现)?

int n = 5;
shared_ptr<int> a(new int[n], default_delete<int[]>());

我想让它看起来像这样,但需要为int数组分配内存并具有自定义的删除器。这可能吗?
int n = 5;
shared_ptr<int> a;
a = make_shared<int>();

可能是shared_ptr指向数组:应该使用吗?的重复问题。 - Sneftel
1
@Sneftel 虽然那里的问题类似,但您提供的链接并不符合 make_shared 的要求,这正是我在这里遇到的问题。 - TheDoomDestroyer
1个回答

7

非常遗憾地,目前使用std::make_shared无法指定自定义删除器。但是,如果您希望可以搭建一个make_shared的包装器。

稍微低效一些,但 ¯\_(ツ)_/¯)

template <typename Type, typename Deleter, typename... Args>
auto make_shared_deleter(Deleter&& deleter, Args&&... args) {
    auto u_ptr = std::make_unique<Type>(std::forward<Args>(args)...);
    auto with_deleter = std::shared_ptr<Type>{
        u_ptr.release(), std::forward<Deleter>(deleter)};
    return with_deleter;
}

然后像这样使用它。
int main() {
    auto ptr = make_shared_deleter<int>(std::default_delete<int>(), 1);
    cout << *ptr << endl;
}

如果您只想使用一个 shared_ptr 并将其指向一个数组,请参阅 shared_ptr to an array : should it be used? 以获取更多信息。


1
啊,我明白了。这有点帮助。谢谢您的回复。 - TheDoomDestroyer
1
我的意思是,你不 真的 需要 with_deleter :) - Rakete1111
但是使用std::make_shared的一个重要好处是减少内存分配,这一点并未得到解决。 - Passer By
@PasserBy std::make_shared 的一个重要部分也是确保异常安全性(与 std::make_unique 一样)。我在我的答案中已经提到,由于重复分配,上述方法比 std::make_shared 效率低。 - Curious
异常安全问题在C++17中得到了解决。至于效率方面,问题并不是立即显而易见的,也许可以链接到一篇相关的帖子? - Passer By

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接