2012-06-10 3 views
0

В программировании существует общее правило, введенное Kernighan & Ричи говорит, что вы называете «свободным» для всего пространства, выделенного «malloc».Бесплатно против инкапсуляции

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

- (UIImage*) convertImage:(UIImage*)sourceImage { 
    unsigned char *rawData = malloc(requiredSpace); 
    ... 
    ... 
    free(rawData); 
    return imageRef; 
} 

Однако вы также инкапсуляцию в пределах функции. Поэтому после возврата из функции память будет автоматически освобождена. Поэтому теоретически в приведенном выше примере не требуется абсолютно бесплатно. Это верно?

+1

Какое колдовство это? – giorashc

ответ

4

Абсолютно нет.

Необходимо, чтобы память free была освобождена только для статически назначенных переменных. Если вы используете malloc (а также calloc или realloc), вы динамически выделяете память, которая не будет освобождена, за исключением случаев, когда вы явно вызываете free.

Например:

-(void)method { 

    char a[10]; 
    char *b = (char*) malloc(10*sizeof(char)); 

} 

a будет уничтожен в конце объема (по крайней мере, будет помечена как свободная память, так что вы не можете полагаться больше на его содержание), в то время как b остается в памяти до конца программы. Если вы потеряете указатель на этот адрес памяти (возможно, назначив другое значение b или просто закончив функцию без возврата b), вы больше не сможете освобождать память, и это приведет к утечке памяти.

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