打印2D阵列时内存泄漏

时间:2019-01-27 18:56:51

标签: c++

打印2D数组时出现内存泄漏,我将数据从向量循环到称为网格的向量中

Grid中的某些索引为空,例如grid [8] [8]为空,但是grid [1] [1]的值为3。 当我显示带有空值的网格索引时,出现内存泄漏。

下面是我的代码,任何建议将不胜感激!

void populateAppendixB(vector<string> cityLocation, int **grid, int col, int row) {

    vector<int> data = appendixB_data(cityLocation);
    vector<string> appendixB_coordinates = getCoordinates(cityLocation);

    vector<int> x_value = returncolValue(appendixB_coordinates);

    vector<int> y_value = returnrowValue(appendixB_coordinates);


    //loop data into grid[][]

    for (int i = 0; i < x_value.size(); i++) {

        grid[x_value[i]][y_value[i]] = data[i];
    }   

    cout << "   ";
    //Top outer Grid

    for (int i = 0; i < col + 2; i++) {
        cout << " # ";
    }
    cout << " # ";
    cout << endl;
    //end

    //y-axis
    for (int j = row; j >= 0; --j) {
        cout << " " << j << "  #  ";

        for (int i = 0; i <= col; ++i) {

            //displaying data
            if(grid[i][j] == 0) {
                cout << "   ";
            }

            else {
                cout << grid[i][j] << "  ";
            }

        }



    //Right outer Grid
    cout << "#";
    cout << endl;
    }


    //Last row of #
    cout << "   ";
    for (int i = 0; i < col + 2; i++) {
        cout << " # ";
    }

    cout << " # ";
    cout << endl;
    cout << "       ";

    //x-Axis
    for (int i = 0; i <= col; i++) {    
        cout << i << "  ";
    }

    cout << endl;

}

2 个答案:

答案 0 :(得分:0)

您使用grid[x_value[i]][y_value[i]] = data[i];,但不会填充所有grid,因为您只填写了grid每一列的一个值(您仅执行以下循环:{{1} }。除非传入的网格正确地预先填充了for (int i = 0; i < x_value.size(); i++) {(不可能告诉您所提交的代码),否则这可能是未定义的行为。

即使它是预先填充的2d数组,当您打印0的元素时,您也会从grid[0, cols]进行迭代,这可能不是您想要的(迭代[0, rows]列和cols+1行。因此,至少最后一个值将访问可能无效的内存。

如先前的评论所述,最好使用rows+1(例如,使用std::vector时访问std::vector<std::vector<int>>来访问利用C ++异常的元素,而不是访问不良的内存),或者甚至.at(i).at(j)也更擅长干净地预防和捕获许多问题。如果您担心速度,那可能不算什么,可以通过例如通过引用传递,将内容包装在智能指针(如果适用)中,移动语义等。

答案 1 :(得分:0)

我通过将所有2D数组值设置为{}解决了我的问题,然后用我想要的值填充网格数组。

它解决了内存泄漏问题,但是我不确定这是否是一个好习惯。