2010-07-21 72 views
1

以下this nice example我发现,我试图创建一个函数,动态生成一个int值的2D网格(二维数组)。二维数组的内存问题

前两次你改变值,但如果在此之后崩溃,它工作得很好。我猜想内存释放的部分不能正常工作。

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

回答

4

2维数组在C++中没有记忆问题:

#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'; 
} 
+0

您正在使用C++而不是C使用标准库,它可以节省您在问题中遇到的问题。 – Mark 2010-07-21 08:52:53

+1

快速评论。之后//确保数据在那里,您应该用numRows替换5,用numCols替换10。 – ozke 2010-07-21 10:38:21

+1

@ozke感谢您指出了这一点。固定。 – 2010-07-21 11:05:39

5

我看到1主要缺陷:

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

+0

非常感谢。我会给出另一个答案是有效的,因为它看起来像是最好的解决方案,但是我希望当你花时间找到问题所在的位置时,我可以同时选中。 – ozke 2010-07-21 08:59:45