向量分割错误向量
Posted
技术标签:
【中文标题】向量分割错误向量【英文标题】:Vector of Vector Segmentation Fault 【发布时间】:2018-03-29 18:45:46 【问题描述】:当我尝试将值分配给这个向量向量时,我不断遇到分段错误。我基本上是从图像中读取像素,然后尝试创建一个向量向量,您可以访问该行,然后访问该行上的像素以获取该点的像素。但是当我尝试将特定像素分配给像素值时,它会给我一个分段错误。我使用 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_back
或construct 大小合适,你不能只是开始将数据粉碎成一个空向量。
【参考方案1】:
您的向量当前为空,这意味着当您尝试分配给您不拥有的内存(使用pixels[i][k] = 255, 255, 255
)时,您将有未定义的行为。
您可以在声明向量时使用正确数量的对象对其进行初始化:
vector<vector<Pixel>> pixels(height, vector<Pixel>(width));
另外,对于未来,您可以使用.at()
代替下标运算符来强制边界检查并避免UB。
【讨论】:
【参考方案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
是一个空向量。它的元素是vector<Pixel>
- 但它没有任何元素。便宜又愉快的解决方案是先计算height
和width
,然后用足够的大小合适的元素构造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 映射到单个向量中的偏移量,并使用宽度和高度构造它。
【讨论】:
以上是关于向量分割错误向量的主要内容,如果未能解决你的问题,请参考以下文章