内存问题与二维数组

时间:2010-07-21 08:40:20

标签: c++ memory arrays multidimensional-array 2d

我发现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 个答案:

答案 0 :(得分:5)

我看到一个主要的错误:

// 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类(或可能提升矩阵)。这看起来像是绑定全局变量和各种其他令人讨厌的东西。

答案 1 :(得分:4)

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';
}