【问题标题】:shared_ptr<> to an array custom deleter (with make_shared)shared_ptr<> 到数组自定义删除器(使用 make_shared)
【发布时间】:2017-07-08 12:10:03
【问题描述】:

是否可以为 shared_ptr 指向的数组使用 make_shared 和自定义删除器(以下是我尝试通过构造函数执行此操作的方式,但我不知道怎么做将通过使用 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>();

【问题讨论】:

标签: c++ arrays shared-ptr


【解决方案1】:

不幸的是,目前无法使用 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? 了解更多信息

【讨论】:

  • 啊,我明白了。这有点帮助。谢谢你的回复。
  • 我的意思是,你真的不需要with_deleter :)
  • 但是使用std::make_shared的很大一部分是减少了分配,这并没有解决这个问题
  • @PasserBy std::make_shared 的很大一部分还确保异常安全(与std::make_unique 一样)。我在回答中已经提到,由于重复分配,上述效率低于std::make_shared
  • 异常安全问题是resolved in C++17。而对于效率部分,问题出在哪里并不是很明显,也许可以链接到有关该问题的帖子?
猜你喜欢
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多