Проблемы с памятью с двумерным массивом - PullRequest
1 голос
/ 21 июля 2010

После этого замечательного примера Я обнаружил, что пытался создать функцию, которая динамически генерирует двумерную сетку (двумерный массив) со значениями 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 ]

5 голосов
/ 21 июля 2010

Я вижу 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).Похоже, вы связываете глобальные переменные и всякие другие неприятные вещи.

4 голосов
/ 21 июля 2010

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