【问题标题】:shared_ptr to an arrayshared_ptr 到一个数组
【发布时间】:2017-07-06 13:31:50
【问题描述】:

如何动态分配 shared_ptr 将指向的“n 个元素”?

我能够创建一个共享指针将指向的静态数组,但我希望用户输入一个数字,然后分配 n 个元素。

shared_ptr<int[10]> p = make_shared<int[10]>();

【问题讨论】:

  • std::shared_ptr&lt;std::vector&lt;int&gt;&gt; ?
  • 不,你不能那样做,不同长度的数组有不同的类型
  • “我能够创建一个共享指针将指向的静态数组”——你最好不要这样做——如果你这样做了,你就处于未定义行为领域。
  • 考虑使用std::array&lt;int, 10&gt; 而不是int[10]

标签: c++ c++11


【解决方案1】:

你应该像这样创建shared_ptr

std::shared_ptr<int> sp( new int[10], std::default_delete<int[]>() );

您必须将其他删除器交给shared_ptr

你不能使用std::make_shared,因为那个函数只提供了一个参数,要在数组上创建指针,你也必须创建删除器。

或者你也可以使用(比如在 cmets 中,带有数组或带有自己的删除器的向量)

std::shared_ptr<std::array<int,6>> ptr(std::make_shared<std::array<int, 6>>(std::array<int, 6>()));

如何获取特定元素? 就这样

std::shared_ptr<int> sp(new int[10], std::default_delete<int[]>());
sp.get()[0] = 5;
std::cout << sp.get()[0] << std::endl;

【讨论】:

    【解决方案2】:

    该语言目前缺乏使用make_shared 来完成此任务的能力。它在P0674 中得到解决。很确定它会进入该语言,尽管它不会是 C++11。

    措辞可以让你说

    auto p = std::make_shared<int[10]>()
    

    auto p = std::make_shared<int[]>(10)
    

    在 C++20 之前(或每当提案正式标准化时),您都只能使用 21koizyd's answer 中链接的 new 语法。

    【讨论】:

    • 啊,我明白了。谢谢你的回复。
    【解决方案3】:

    我认为这个问题更好的是 unique_ptr 模板。

    int amount = 10;
    std::unique_ptr<int[]> name(new int[amount]);
    

    【讨论】:

      【解决方案4】:

      我发现下面的表格是错误的。

      std::shared_ptr<std::array<int,6>> ptr(std::make_shared<std::array<int, 6>>(std::array<int, 6>()));
      

      它调用了两次析构函数。

      如果你的输入不是int等原生类型,会导致崩溃。

      大家可以试试。

      std::shared_ptr<std::array<int,6>> ptr(std::make_shared<std::array<int, 6>>());
      

      也许上面的说法是正确的?

      有谁知道它为什么会调用两次析构函数?

      有什么想法吗?

      【讨论】:

      • 虽然这肯定会接管无法用于数组的 make_shared 函数,但对于应该允许用户决定他希望数组有多少元素的问题,它肯定无济于事。因此,构造函数的解决方法被用作 C++20 之前的最佳解决方法,
      猜你喜欢
      • 2012-10-15
      • 2020-10-25
      • 1970-01-01
      • 2018-11-18
      • 2018-04-14
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多