2016-02-03 2 views
0

Привет У меня проблема с освобождением массива в моем коде.Все еще доступные блоки - valgrind

int main(){ 
int **pole = mallocator(); ... 

В основной функции I вызова, который выделяет память и выглядит следующим образом:

int ** mallocator(){ 
int **pole = (int **) malloc(sizeof(int*)*RADEK); 

for(int i=0; i < RADEK; i++){ 
    pole[i] = (int *) malloc(sizeof(int)*RADEK); 

} 

return pole; 
} 

И в конце концов я бесплатно его с помощью этой функции:

void freedom(int **pole){ 

for(int i=0; i < RADEK; i++){ 
    printf("%d\n", i); 
    free(pole[i]); 
} 
free(pole); 
} 

RADEK постоянен со значением 25 Я думал, что это сработало, но valgrind говорит, что у меня 27 ассигнований и 26 frees и говорит, что один блок по-прежнему доступен. Любые идеи о том, как не получить утечек? Спасибо

РЕДАКТИРОВАТЬ: Линия возврата не должна была находиться в цикле, который был сильно скопирован, спасибо, что заметили. Также, вероятно, это была ошибка компилятора. Если я использую gcc вместо g ++, он говорит, что утечек нет, но когда я скомпилирован с g ++, он говорит, что статический все еще доступен: 72,704, даже если я не использую malloc в коде.

+2

Я не думаю, что ваш 'обратный полюс,' находится в правильном положении. – MikeCAT

+0

Говорят, [вы не должны указывать результат 'malloc()' in C] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). – MikeCAT

+0

В какой операционной системе вы работаете? –

ответ

0

после исправления функции mallocator(), как указано в комментариях.

Тогда функция main() может освободить выделенную память через:

for(int i=0; i<RADEK; i++) 
{ 
    free(pole[i]); 
} 
free(pole);