2011-08-10 2 views
0

Я попытался освободить 2D массива в C с использованием Visual Studio 2005 & 2008:Проблемы с освободив 2D-массив в C

void Free_C(int **Cmat) 
{ 
    int i; 
    for (i=0;i<ROW;i++) 
     free(Cmat[i]); 
    free(Cmat); 
} 

Когда добраться до второй свободной линии его падения с высказыванием ошибки:

HEAP CURRUPTION DETECTED:...CRT detected that application wrote to memory after end of heap 

Я выделил массив так:

C=malloc(ROW*sizeof(int*)); 
for (i=0;i<RC;i++) 
    C[i]=malloc(COL*sizeof(int)); 

Я также попробовал, что с calloc, но это приводит к той же ошибке.

+5

Как вы выделить этот массив? Каждый 'free' должен соответствовать' malloc', который вы делали ранее. – sth

+2

Можете ли вы показать код, который вы использовали для выделения массива в первую очередь? – JaredPar

+0

На это нельзя ответить, не видя, как вы выделили массив. –

ответ

3

Трудно ответить на этот вопрос без предварительного понимания того, как вы выделили массив. Вывешенный вами код кажется правильным, если предположить, что сам массив был распределен аналогичным образом. Например (проверка ошибок опущено для краткости)

int** Malloc_C(int row_size) { 
    int** ppArray = malloc(sizeof(int*) * ROW); 
    int i; 
    for (i = 0; i < ROW; i++) { 
    ppArray[i] = malloc(sizeof(int) * row_size); 
    } 
    return ppArray; 
} 
+0

thats то, что я сделал – DoronS

+1

@DoronS, если это так, то очень вероятно, что другая часть вашей программы искажает память вокруг массива и, следовательно, вызывает проблему на 'free'. Я бы начал с изучения всех циклов против внешнего массива и использования программы, такой как valgrind, чтобы помочь отследить проблему – JaredPar

0

Не зная, как вы выделили массив, что это могло возможно среднее является 2D-массив был выделен с первым указатель, ссылающийся на весь буфер памяти, выделенной с помощью malloc(), а остальные указатели в указателе-массиве указывают на буфер памяти. Поэтому, как только вы вызвали free на первый указатель в массиве указателей, вы фактически освободили весь буфер памяти ... вызов free снова на другом указателе в массиве будет пытаться освободить память, которая уже была освобождена ,

Например, массив может быть выделен с помощью следующей методики:

int** ptr_array = malloc(sizeof(int*) * NUM_ROWS); 
*ptr_array = malloc(sizeof(int) * NUM_ROWS * NUM_COLUMNS); 

int* temp = *ptr_array; 
for (int i=0; i < NUM_ROWS; i++) 
{ 
    ptr_array[i] = temp; 
    temp += NUM_COLUMNS; 
} 
Смежные вопросы