【问题标题】:Free vs. encapsulation免费与封装
【发布时间】:2012-06-10 10:47:40
【问题描述】:

在编程中,Kernighan & Ritchie 引入了一条通用规则,即您已为“malloc”分配的所有空间调用“空闲”。

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

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

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

【问题讨论】:

  • 这是什么魔法?

标签: objective-c memory-management malloc free


【解决方案1】:

绝对没有。

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

例如:

-(void)method {

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

}

a会在作用域结束时被销毁(至少,会被标记为空闲内存,这样你就不能再依赖它的内容了),而b会一直保留在内存中直到程序结束.如果您丢失了指向该内存地址的指针(可能为b 分配了另一个值,或者只是结束函数而不返回b),您将无法再释放内存,这将导致内存泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 2017-07-07
    • 1970-01-01
    • 2012-02-16
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多