C++网格类(STD::向量的细胞)自定义调整大小函数导致分割错误
我有一个2D网格类,它是由单元格组成的,我必须将单元格存储在一个1D std::vector中,因为规范对2D网格建模 我已经编写了一个Grid::resize函数,该函数将网格的大小调整为新的宽度和高度,但将网格的内容保留在所有新单元格设置为的保留区域内 牢房:死了 我编写了一个resize函数,当运行时会导致分段错误:11,我假设这意味着函数试图访问向量边界之外的数据,但我不确定错误在哪里 阶级 您正在使用原始网格宽度计算新网格中的索引。它们可能会有很大的不同,因此您将复制错误的单元或访问新单元之外的内存 此外,事实上,在尝试访问坐标宽度为-1、高度为-1的最后一个单元格时,总是执行无效的内存访问,该单元格的高度*width-width+width-1+1=高度*width。向量的最后一个有效索引是height*width-1 你可以使用自由函数C++网格类(STD::向量的细胞)自定义调整大小函数导致分割错误,c++,segmentation-fault,resize,stdvector,C++,Segmentation Fault,Resize,Stdvector,我有一个2D网格类,它是由单元格组成的,我必须将单元格存储在一个1D std::vector中,因为规范对2D网格建模 我已经编写了一个Grid::resize函数,该函数将网格的大小调整为新的宽度和高度,但将网格的内容保留在所有新单元格设置为的保留区域内 牢房:死了 我编写了一个resize函数,当运行时会导致分段错误:11,我假设这意味着函数试图访问向量边界之外的数据,但我不确定错误在哪里 阶级 您正在使用原始网格宽度计算新网格中的索引。它们可能会有很大的不同,因此您将复制错误的单元或访问新
void Grid::resize(const unsigned int new_width, const unsigned int new_height) {
std::vector<Cell> new_cells(new_width*new_height);
unsigned int x, y;
for(x = 0; x < new_width; x++) {
for(y = 0; y < new_height; y++) {
if(x < this->width && y < this->height) {
new_cells[get_index(x,y)] = this->grid_cells[get_index(x,y)];
}
else {
new_cells[get_index(x,y)] = Cell::DEAD;
}
}
}
this->width = new_width;
this->height = new_height;
this->grid_cells = new_cells;
}
unsigned int
get_index(const unsigned int x, const unsigned int y, const unsigned int width) const{
return (y * width) + x ;
}
而且
new_cells[get_index(x,y, new_width)] = this->grid_cells[get_index(x,y, this->width)]
什么是get_索引?如果您可以调整到较小的宽度或高度,那么其中一个索引肯定会超出新向量的边界。将2D x,y坐标转换为向量的1D索引问题是为什么可能有缺陷的函数没有问题。是的,抱歉,我现在添加了它如果0,0对应于索引1,那么m,n不对应于m*width+n+1,为什么不使用基于0的索引?
const unsigned int Grid::get_index(const unsigned int x, const unsigned int y) const{
return ((y * this->width) + x + 1);
}
const unsigned int
Grid::get_index(const unsigned int x, const unsigned int y) const{
return ((y * this->width) + x + 1);
}
unsigned int
get_index(const unsigned int x, const unsigned int y, const unsigned int width) const{
return (y * width) + x ;
}
new_cells[get_index(x,y, new_width)] = this->grid_cells[get_index(x,y, this->width)]