2012-06-10 61 views
0

在编程中有一个通用规则Kernighan &里奇说,你已经为“malloc”分配的所有空间调用“免费”。免费与封装

所以下面的代码是正确的:

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

但是你也有一个函数内封装。所以从函数返回后,内存将被自动释放。所以理论上,免费在上面的例子中并不是绝对需要的。它是否正确?

+1

这是什么样的魔法? – giorashc

回答

4

绝对没有。

free是必要的,因为只有静态分配的变量才会释放内存。如果使用malloc(以及callocrealloc),则动态分配的内存将不会被释放,除非您明确呼叫free

例如:

-(void)method { 

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

} 

a将在范围的结束被销毁(至少,将被标记为空闲内存,使你不能就其内容不再依赖),而b保持记忆直到程序结束。如果你丢失了指向那个内存地址的指针(也许给b指定另一个值或者简单地结束该函数而不返回b),你将不能再释放内存,这会导致内存泄漏。