首页 > 解决方案 > 打印二维数组时内存泄漏

问题描述

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

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

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

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;

}

标签: c++

解决方案


您使用grid[x_value[i]][y_value[i]] = data[i];,但不会填写所有的,grid因为您只填写每一列的一个值grid(您只执行此循环:)for (int i = 0; i < x_value.size(); i++) {。除非传入的网格是用 ' 正确预填充0的(根据您提交的代码无法判断),否则这可能是未定义的行为。

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

正如之前的评论所提到的,最好只使用std::vector(例如std::vector<std::vector<int>>,在使用.at(i).at(j)访问使用 C++ 异常而不是访问坏内存的元素时),或者甚至std::array更善于干净地防止和捕获许多问题。如果您担心速度,这可能不是什么大问题,您可以通过例如通过引用传递、在适用的情况下将内容包装在智能指针中、移动语义等来避免复制。


推荐阅读