2015-01-06 1 views
2

В C у меня есть следующая функция для создания 2D-массива.Освобождение 2D-массива указателей от функции в C

int** createMatrix(int xdim, int ydim){ 
     int** mat = malloc(xdim*sizeof(int*)); 

     int i; 
     for(i=0; i<xdim; i++){ 
       mat[i] = malloc(ydim*sizeof(int)); 
     } 

     return mat; 
} 

В функции вызывающего абонента (интермедиат основной() в данном случае):

int **matA = createMatrix(10, 10); 
free(matA); 

я, кажется, есть проблема с освобождения памяти, и мне интересно, если это происходит потому, что переменная «мат» никогда не освобождается.

Достаточно ли свободного (matA), как я это сделал? Или проблема, которую я не могу освободить (мат)?

+0

как '' mat' и matA' являются указателями на том же месте, поэтому, когда вы 'свободный (Mata)' как, если бы вы гипотетически 'свободный (мат) '(кроме того, что' mat' не находится в области видимости, поэтому вы не можете его освободить). Проблема, о которой говорится в ответах, заключается в том, что вы слишком свободны для всей выделенной памяти (на которую указывает каждый указатель в 'matA') – bolov

ответ

5

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

for(i=0; i < xdim; i++) 
    free(matA[i]); 

free(matA) 

Я бы рекомендовал создать freeMat функцию, чтобы сделать это

2

Освободить указатель на самом деле означает, что вы освобождаете память, которую он указывает на другое выделение. Итак, да, освобождение matA освободит кусок выделенной вами памяти, но вам нужно освободить каждый из выделенного элемента mat.

for(int i = 0; i < xdim; i++) 
    free(matA[i]); 
free(matA); 
0

Недостаточно, чтобы освободить только matA. matA ссылается на хранилище для xdim указателей на int, но каждый из этих указателей ссылается на отдельный блок хранения. Если вы выделяете массив массивов таким образом, вы должны освобождать не только внешний массив, но также (сначала) каждый из внутренних массивов.

0

Когда вы освобождаете память, ранее выделенную для переменной (скажем, ptr), вы теряете доступ к ней. Функция free не изменяет значение ptr, поэтому она по-прежнему указывает на то же место (теперь оно недействительно).

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

Если вы бесплатно один из [xdim] первых, вы потеряете доступ ко всем [ydim] с (утечку памяти), на котором он указывал. Другими словами, вы не сможете их освободить. OS на вашем компьютере может освободить его автоматически (но нет никакой гарантии), но это хорошая практика, чтобы контролировать процесс освобождения памяти:

[ X ]---[ydim]--[ydim]-[ydim] 
[ X ]---[ydim]--[ydim]-[ydim] 
[ X ]---[ydim]--[ydim]-[ydim] 

Так что лучше свободных элементов, не «отвечает» за другой элементы. В вашем случае это [ydim] s. Сначала освобождая такие элементы, вы не потеряете другие элементы, ваши [xdim] s. Затем вы можете пройти через [xdims] и освободить их:

// freed `[ydim]` of the first `[xdim]` 
[xdim]---[ X ]--[ X ]-[ X ] 
[xdim]---[ X ]--[ X ]-[ X ] 
[xdim]---[ X ]--[ X ]-[ X ] 

// now you can free all `[xdim]` 
[ X ] 
[ X ] 
[ X ]  

// the `matA` array has been freed 
Смежные вопросы