2010-07-21 3 views
1

Après this nice example J'ai trouvé, j'essayais de créer une fonction qui génère dynamiquement une grille 2D (tableau à deux dimensions) de int valeurs.Problèmes de mémoire avec le tableau à deux dimensions

Cela fonctionne assez bien les deux premières fois que vous modifiez les valeurs, mais si cela se bloque après cela. Je suppose que la partie où la mémoire est libérée ne fonctionne pas comme elle le devrait.

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

Répondre

4

tableau 2-dim en C++ sans problèmes de mémoire:

#include <vector> 

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

Utilisation:

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

Vous utilisez C++ non C utilisez la bibliothèque standard, elle vous évite le type de problèmes que vous avez dans votre question. – Mark

+1

Commentaire rapide. Après // Assurez-vous que les données sont là, vous devez remplacer 5 par numRows et 10 par numCols – ozke

+1

@ozke Merci de le signaler. Fixé. –

5

Je vois 1 bug majeur:

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

Ici la variable 'i' est utilisé comme premier index dans 'Arr2D' et va jusqu'à un maximum de (numRows -1)
Alors que dans ce code:

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

La variable 'i' est utilisé comme premier indice, mais va jusqu'à un maximum de (numColumns-1). Si numRows est beaucoup plus grand que numColumns alors nous allons avoir un problème.

En note. Lorsque vous essayez et nettoyez vous fuyez les colonnes:

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

Ensuite la chose à noter.
Ce n'est vraiment pas une bonne idée. Utilisez certaines des classes STL fournies (ou potentiellez Matrix). Cela ressemble à des variables globales contraignantes et à toutes sortes d'autres choses désagréables.

+0

Merci beaucoup. Je vais donner l'autre réponse comme valide parce que cela ressemble à la meilleure solution, mais je voudrais pouvoir cocher les deux comme vous avez passé du temps à trouver où le problème est. – ozke

Questions connexes