2015-02-17 2 views
3

У меня есть эта программа. Я слышал, что память, выделенная с помощью malloc, может быть освобождена вне функции, в которой она была выделена, но, очевидно, я не могу освободить z в main. Есть ли утечка памяти в этой программе?Будет ли эта программа вызывать утечку памяти?

#include <stdio.h> 
#include <stdlib.h> 

int *add(int x, int y); 

int main(int argc, char const *argv[]) { 
    int *x = NULL; 
    x = add(5, 4); 

    printf("%d\n", *x); 
    free(x); 
    return 0; 
} 

int *add(int x, int y) { 
    int *z = malloc(sizeof(int)); 
    *z = x + y; 
    return z; 
} 
+1

Нет, утечки памяти здесь нет. Но вам все равно нужно проверить, действительно ли пространство выделено, а 'z' - не-NULL. –

+0

Не то, что вы можете отлично сделать это 'z [0] = x + y;', а также объявить указатель и вызвать 'malloc()' в одной строке, может быть запутанным, из-за оператора присваивания он может выглядеть так, как будто вы разыменование указателя с помощью '*'. –

ответ

2

Нет, ваша программа не приведет к утечке памяти, поскольку выделенный блок памяти, который был сделан внутри функции add(), правильно освобожден в функции main.

Единственное требование для free ывая быть действительным является то, что указатель, переданный free пришел из malloc, и не было двойной free -d. Имя переменной, которой назначен указатель, не имеет значения.

Тот факт, что распределение и освобождение происходит в разных функциях, также не имеет отношения к делу. На самом деле, для программ с динамическим распределением памяти это обычное явление для выполнения их распределений и деаллокаций внутри разных функций.

1

Этот код не будет просачиваться.

Вы правильно освобождаете выделенную память.

2

Нет. Вы выделяете память на один int и сохраняете эту память в переменной x. Затем вы освобождаете эту память, когда вы free(x). Однако вы должны выполнить if(z == NULL) в своей функции.

+0

Это лучший ответ, потому что хотя программа не будет утечки памяти, это может привести к неопределенному поведению, в случае, если возвращаемый '' NULL' элемент poitner 'malloc()' был разыменован. –

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