c++中vector在尝试push_back实例时出现奇怪的错误

Weird error with vectors in C++ when trying to push_back an instance

本文关键字:错误 实例 back vector push c++      更新时间:2023-10-16

我想做一个push_back,但Code::Blocks给我发送了一个奇怪的错误。我已经调试了这段代码很多很多次,但我不能识别错误。方法LoadFromConsole与误差相符。

特别是当我经过m_blocks.pushback(blocks)行时发生错误。我将粘贴一些类。如果你需要更多的类来帮助我,我将粘贴剩下的代码。谢谢你。

class Block{
    int m_left;
    int m_top;
    int m_right;
    int m_bottom;

public:
Block();
    void set_values(int,int,int,int);
    void loadFromFile(ifstream*f);
      void loadFromConsole(int x,int y, int z, int w);
    int getValue(int side);

    void print();
};

void Block::set_values(int izq,int arriba,int der,int abajo){
    m_top = arriba;
    m_left = izq;
    m_bottom = abajo;
    m_right = der;
}


class Board{
        uint64_t m_timer;
        int m_step;

        int m_width;
        int m_height;

        vector<Block> m_blocks;

        bool solveState(State*state);
        bool isValid(State*state);
        bool isValidSide(State*state,int cell,int side,int cell1,int side1);
        bool isValidSideImplementation(State*state,int cell,int side,int cell1,int side1);

        void printState(State*state);
public:
        Board();

        void loadFromFile(ifstream*file);
        void loadFromConsole(int FIL, int COL);
        void solve();
};
void Board::loadFromConsole(int FIL,int COL ){
        m_height = FIL;
        m_width = COL;
    srand(time(0));
    matriz = new int*[COL];
    for (int i = 0; i < FIL; i++){
        matriz[i] = new int[COL];
    }
    matriz[0][0] = rand()%8+1;
    matriz[0][1] = rand()%8+1;
    matriz[0][2] = rand()%8+1;
    matriz[0][3] = rand()%8+1;
    for (int i = 1; i < m_width; i++){
        matriz[i][0] = rand()%8+1;
        matriz[i][1] =  matriz[i-1][2];
        matriz[i][2] = rand()%8+1;
        matriz[i][3] = rand()%8+1;
    }
    for (int j = 4; j < m_width*4; j+=4){
        matriz[0][j] = matriz[0][j-1];
        matriz[0][j+1] =  rand()%8+1;
        matriz[0][j+2] = rand()%8+1;
        matriz[0][j+3] = rand()%8+1;
    }
    for (int i = 1; i < m_width; i++ ){
        for (int j = 4; j < (m_width*4); j+=4){
            matriz[i][j] = matriz[i][j-1];
            matriz[i][j+1] =  matriz[i-1][j+1];
            matriz[i][j+2] = rand()%8+1;
            matriz[i][j+3] = rand()%8+1;
        }
    }
        for(int i=0;i<m_height;i++){
                for(int j=0;j< (m_width*4);j+=4){
                         Block block;
                         block.print();
                         m_blocks.push_back(block);
                }
        }
}

关于:

matriz = new int*[COL];
for (int i = 0; i < FIL; i++){
    matriz[i] = new int[COL];
}

我认为第一个new应该使用FIL而不是COL

否则你创建的是一个COL x COL矩阵,而不是FIL x COL矩阵,因此你很可能在接下来的作业中书写超出了矩阵的末尾,特别是当COL小于FIL时。

此外,这段代码显然超出了矩阵的边界,并且似乎使用width来引导,而它应该使用height:

for (int i = 1; i < m_width; i++ ){
    for (int j = 4; j < m_width*4; j+=4){
        matriz[i][j] = matriz[i][j-1];

在这里乘以4是不必要的,这会导致您读取/写入超出数组末尾的索引,从而调用未定义的行为。具体来说,如您所说,如果FILCOL是相同的值,则访问m_width及以上元素的事实是不正确的。

你的程序有未定义行为。你在读取和覆盖不属于你的记忆。这两个循环计数器远远超过了允许索引到所有数据行的底层内存分配:

// this is wrong. it will far-exceed the allocated
//  size of matrix[0], which is m_width int vals
for (int j = 4; j < m_width*4; j+=4){
    matriz[0][j] = matriz[0][j-1];
    matriz[0][j+1] =  rand()%8+1;
    matriz[0][j+2] = rand()%8+1;
    matriz[0][j+3] = rand()%8+1;
}

后来…

// Note:this is also wrong. it should be using m_height
for (int i = 1; i < m_width; i++ )
{
    // this is wrong. same problem as the other j-loop 
    for (int j = 4; j < (m_width*4); j+=4){
        matriz[i][j] = matriz[i][j-1];
        matriz[i][j+1] =  matriz[i-1][j+1];
        matriz[i][j+2] = rand()%8+1;
        matriz[i][j+3] = rand()%8+1;
    }
}

在两个j循环中,你以4的增量枚举,直到(m_width-1)*4。假设COL作为10传入。枚举将是:

4, 8, 12, 16, 20, 24, 28, 32, 36
      ^^^^^^^^^^^^^^^^^^^^^^^^^^   ALL OUTSIDE ALLOCATED RANGE
  ^^^ OUTSIDE ALLOCATED RANGE FOR [j+2] and [j+3]

考虑将每一行分配为:

for (int i = 0; i < FIL; i++)
    matriz[i] = new int[COL]; // << always smaller than 
                              //  4*(COL-1) unless COL is 1
相关文章: