簡體   English   中英

打印二維數組時內存泄漏

[英]Memory leak when printing 2D array

打印二維數組時出現內存泄漏,我將數據從向量循環到稱為網格的向量中

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;

}

您使用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 ,它們更擅長干凈地預防和捕獲許多問題。 如果您擔心速度,這可能不是什么大問題,您可以通過例如通過引用傳遞、將事物包裝在智能指針中(如果適用)、移動語義等來避免復制。

我通過將所有二維數組值設置為 { } 解決了我的問題,然后使用我特別想要的值填充網格數組。

它解決了內存泄漏問題,但我不確定這是否是一個好習慣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM