的shared_ptr<>到数组自定义删除器(使用make_shared)

时间:2017-07-08 12:10:04

标签: c++ arrays shared-ptr

是否可以使用 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>();

1 个答案:

答案 0 :(得分:6)

遗憾的是,目前无法使用std::make_shared指定自定义删除工具,但如果需要,可以在make_shared周围创建一个包装器

a little less efficient,但是¯\ _(ツ)_ /¯)

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?了解更多