2010-07-21 3 views
1

После this nice example Я нашел, я пытался создать функцию, которая динамически генерирует 2D-сетку (двухмерный массив) значений 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; 
} 

ответ

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

+1

Быстрый комментарий. После // Убедитесь, что данные там, вы должны заменить 5 на numRows и 10 на numCols – ozke

+1

@ozke Спасибо, что указали это. Исправлена. –

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

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

+0

Большое спасибо. Я дам другой ответ как действительный, потому что он выглядит как наилучшее решение, но я бы хотел, чтобы я мог указывать на то, как вы тратили время на поиск проблемы. – ozke

Смежные вопросы