免费与封装



在编程中,Kernighan & Ritchie引入了一条一般规则,即对于"malloc"分配的所有空间,您都可以调用"free"。

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

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

但是,函数中也有封装。所以从函数返回后,内存会自动释放。所以理论上在上面的例子中并不是绝对需要的。这是对的吗?

绝对没有。

free是必需的,因为内存将仅释放给静态分配的变量。如果使用malloc(以及callocrealloc),则正在动态分配不会释放的内存,除非显式调用free

例如:

-(void)method {
    char a[10];
    char *b = (char*) malloc(10*sizeof(char));
}

a将在范围结束时销毁(至少将被标记为可用内存,以便您不能再依赖其内容),而b保留在内存中直到程序结束。如果您丢失了指向该内存地址的指针(可能为b分配另一个值,或者只是结束函数而不返回b),您将无法再释放内存,这将带来内存泄漏。

最新更新