【问题标题】:Vector of Vector Segmentation Fault向量分割错误向量
【发布时间】:2021-12-16 08:44:15
【问题描述】:

当我尝试将值分配给这个向量向量时,我不断遇到分段错误。我基本上是从图像中读取像素,然后尝试创建一个向量向量,您可以访问该行,然后访问该行上的像素以获取该点的像素。但是当我尝试将特定像素分配给像素值时,它会给我一个分段错误。我使用 {255,255,255} 的占位符作为示例像素,但我计划使用 this->PIX[num_pix].r() 如果我可以让它工作,这基本上是我的 Image 类中的像素获取器,其中 num_pix 是迭代的当前像素。

vector<vector<Pixel>> Image::as_rows(){
  vector<vector<Pixel>> pixels;
  int i,k,height, width,pix_num;
  pix_num=0;
  height = this->HDR.height();
  width = this->HDR.width();
  for(i=0;i<height;i++){
    for(k=0;k<width;k++){
       pix_num++;
       pixels[i][k] = {255,255,255};
    }
  }
  return pixels;
}

【问题讨论】:

  • 您忘记事先调整矢量大小。访问向量的元素不会自动调整其大小以确保该元素存在。或者 push_back 可用的元素和向量。
  • 你必须push_backconstruct 大小合适,你不能只是开始将数据粉碎成一个空向量。

标签: c++ vector segmentation-fault


【解决方案1】:

您的问题是 pixels 是一个空向量。它的元素是vector&lt;Pixel&gt; - 但它没有任何元素。便宜又愉快的解决方案是先计算heightwidth,然后用足够的大小合适的元素构造pixels

    const int height = this->HDR.height();
    const int width  = this->HDR.width();
    std::vector<std::vector<Pixel>> pixels(height, {width, {0,0,0}});

但是,这将具有可怕的内存局部性属性。我强烈建议您编写一个 Bitmap 类,它将 x,y 映射到单个向量中的偏移量,并使用宽度和高度构造它。

【讨论】:

    【解决方案2】:

    您尝试访问一个空向量,这是未定义的行为。您必须先分配元素,然后才能像您尝试做的那样通过索引访问它们。在开始时使用正确数量的对象初始化向量的另一种方法是 push_back 您需要的对象。使用 Pixel 对象的向量向量,您会想要填充这样的内容。

    std::vector<std::vector <Pixel> > pixels;
    for(i=0;i<height;i++)
    {
        pixels.push_back(std::vector<Pixel>());
        for(k=0;k<width;k++)
        {
            pix_num++;
            pixels[i].push_back({255,255,255});
        }
    }
    

    【讨论】:

      【解决方案3】:

      您的向量当前为空,这意味着当您尝试分配不属于您的内存(使用pixels[i][k] = {255, 255, 255})时,您将有未定义的行为。

      当你声明它时,你可以用正确数量的对象来初始化你的向量:

      vector<vector<Pixel>> pixels(height, vector<Pixel>(width));
      

      另外,对于未来,您可以使用.at() 代替下标运算符来强制边界检查并避免UB。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 2020-04-19
        • 2015-03-01
        相关资源
        最近更新 更多