C++网格类(STD::向量的细胞)自定义调整大小函数导致分割错误

C++网格类(STD::向量的细胞)自定义调整大小函数导致分割错误,c++,segmentation-fault,resize,stdvector,C++,Segmentation Fault,Resize,Stdvector,我有一个2D网格类,它是由单元格组成的,我必须将单元格存储在一个1D std::vector中,因为规范对2D网格建模 我已经编写了一个Grid::resize函数,该函数将网格的大小调整为新的宽度和高度,但将网格的内容保留在所有新单元格设置为的保留区域内 牢房:死了 我编写了一个resize函数,当运行时会导致分段错误:11,我假设这意味着函数试图访问向量边界之外的数据,但我不确定错误在哪里 阶级 您正在使用原始网格宽度计算新网格中的索引。它们可能会有很大的不同,因此您将复制错误的单元或访问新

我有一个2D网格类,它是由单元格组成的,我必须将单元格存储在一个1D std::vector中,因为规范对2D网格建模

我已经编写了一个Grid::resize函数,该函数将网格的大小调整为新的宽度和高度,但将网格的内容保留在所有新单元格设置为的保留区域内 牢房:死了

我编写了一个resize函数,当运行时会导致分段错误:11,我假设这意味着函数试图访问向量边界之外的数据,但我不确定错误在哪里

阶级

您正在使用原始网格宽度计算新网格中的索引。它们可能会有很大的不同,因此您将复制错误的单元或访问新单元之外的内存

此外,事实上,在尝试访问坐标宽度为-1、高度为-1的最后一个单元格时,总是执行无效的内存访问,该单元格的高度*width-width+width-1+1=高度*width。向量的最后一个有效索引是height*width-1

你可以使用自由函数

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)]