代码之家  ›  专栏  ›  技术社区  ›  ozke

二维数组的内存问题

  •  1
  • ozke  · 技术社区  · 16 年前

    跟随 this nice example 我发现,我试图创建一个动态生成二维网格(二维数组)的函数。 int 价值观。

    它在最初几次更改值时工作得相当好,但如果在这之后崩溃。我想释放记忆的部分不会像它应该的那样工作。

    void testApp::generate2DGrid() {
        int i, j = 0;
    
        // Delete previous 2D array
        // (happens when previous value for cols and rows is 0)
        if((numRowsPrev != 0) && (numColumnsPrev != 0)) {
            for (i = 0; i < numRowsPrev; i++) {
                delete [ ] Arr2D[i];
            }
        }
    
        // Create a 2D array
        Arr2D = new int * [numColumns];
        for (i = 0; i < numColumns; i++) {
            Arr2D[i] = new int[numRows];
        }
    
        // Assign a random values
        for (i=0; i<numRows; i++) {
            for (j = 0; j < numColumns; j++) {
                Arr2D[i][j] = ofRandom(0, 10);
            }
        }
    
        // Update previous value with new one
        numRowsPrev = numRows;
        numColumnsPrev = numColumns;
    }
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Vijay Mathew Chor-ming Lung    16 年前

    C++中的2-DIM数组,无内存问题:

    #include <vector>
    
    typedef std::vector<int> Array;
    typedef std::vector<Array> TwoDArray;
    

    用途:

    TwoDArray Arr2D; 
    
    // Add rows
    for (int i = 0; i < numRows; ++i) {
        Arr2D.push_back(Array());
    }
    
    // Fill in test data
    for (int i = 0; i < numRows; i++) {    
        for (int j = 0; j < numCols; j++) {
            Arr2D[i].push_back(ofRandom(0, 10));           
        }
    }
    
    // Make sure the data is there
    for (int i = 0; i < numRows; i++) {    
        for (int j = 0; j < numCols; j++) {
            std::cout << Arr2D[i][j] << ' ';
        }
    std::cout << '\n';
    }
    
        2
  •  5
  •   Loki Astari    16 年前

    我看到一个主要错误:

    // Assign a random values
    for (i=0; i<numRows; i++){
        for (j=0; j<numColumns; j++){
            Arr2D[i][j] = ofRandom(0, 10);
        }
    }
    

    这里变量“i”用作“arr2d”的第一个索引,最大值为(numrows-1)
    在此代码中:

    for (i=0; i<numColumns; i++)
    {
        Arr2D[i] = new int[numRows];
    }
    

    变量“i”用作第一个索引,但最大值为(numcolumns-1)。如果numRows比numColumns大很多,那么我们将遇到一个问题。

    作为旁注。当你试图清理时,你漏了柱子:

    if((numRowsPrev != 0) && (numColumnsPrev != 0))
    {
        for (i=0; i<numRowsPrev; i++){
            delete [ ] Arr2D[i];
        }
        // Need to add this line:
        delete [] Arr2D;
    }
    

    接下来要注意的是。
    这真的不是个好主意。使用一些提供的stl类(或可能的boost矩阵)。这看起来像是绑定了全局变量和其他各种讨厌的东西。