2010-07-21 106 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