【问题标题】:Accessing array of shared_ptr访问 shared_ptr 数组
【发布时间】:2015-06-11 12:03:03
【问题描述】:
#include <memory>

int main()
{
   std::shared_ptr<double> array (new double [256], [](double * d){
      delete [] d;
   });
}

我创建了一个 shared_ptr 指向一个具有自己自定义删除器的双精度数组。

现在如何访问数组?假设我希望访问索引1 处的数组。我尝试了通常的“括号法”,但出现错误。

array 这个词默认指向它的第一个元素,但是如果我想访问第二个元素呢?使用增量和括号会给我“与运算符不匹配”错误。

有人可以向我解释一下幕后发生了什么吗?

我问这个是为了研究目的,尽管我知道unique_ptrvector 会做得更好。

【问题讨论】:

  • 不好意思问,c++17中不应该是std::shared_ptr&lt;double[]&gt; array (new double [256], [](double * d){ delete [] d; });std::shared_ptr&lt;double&gt; array (new double [256]);,甚至是std::shared_ptr&lt;double&gt; array = std::make_shared&lt;double[]&gt;(256);吗?

标签: c++


【解决方案1】:

括号符号被定义为与指针类型一起使用(你是对的,给定数组array,表达式array 衰减为具有指向第一个元素的此类类型的表达式)但是,尽管它的功能,std::shared_ptr不是指针类型

你必须obtain the raw pointer first:

array.get()[n];

n 当然是一个有效的数组下标。

std::unique_ptr 也是如此(但请注意,in that case, you do not need to supply your own deleter!)。

【讨论】:

  • @CarloBrew 是的。
  • (*array)[n] 顺便说一句,这给了我错误。下标的类型无效。
  • @CarloBrew 是和否。使用 unique_ptr 您可以将模板参数指定为 double[] 而不是 double 并且您不必提供 destrcutor - 唯一 ptr 将调用 delete[]
  • @LightnessRacesinOrbit 这是我尝试过的(*array)[0] = 50.0; std::cout&lt;&lt;(*array)[0];
  • @David:是的,我的回答是这样的:)
【解决方案2】:

在 C++17 中,支持 shared_ptr 数组,如 unique_ptr(c++11)。

int main()
{

   std::shared_ptr<double[]> array1 (new double [3]{4,5,6}, [](double * d){
   delete [] d;});

   std::unique_ptr<double[]> array2 (new double [3]{4,5,6}, [](double * d){
   delete [] d });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-10
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多