free()和release之间的区别

时间:2012-10-09 12:49:05

标签: objective-c cocoa-touch memory-management free

  

可能重复:
  What are the differences between free, dealloc, release, and autorelease?

我想摆脱我在应用中使用的已分配内存。我知道我需要使用release,但free()release之间有什么区别?它们是一样的吗?

2 个答案:

答案 0 :(得分:4)

free()是C标准库的一部分,因此它是一个函数。它立即释放使用malloc()获得的已分配内存,因此必须传递由malloc()分配的指针,否则它将调用未定义的行为。

- releaseNSObject类的方法(而不是函数)。它没有立即释放内存;它只将对象的引用计数减1。然后它还检查它是否为0 - 如果它为零,则调用- dealloc(通常由子类重写以释放由构造方法- initfree()内存分配的内存由malloc()分配。

所以它们根本不相同, 甚至不会尝试互换使用它们!

答案 1 :(得分:-1)

更有趣的部分是免费的工作方式:(在这方面,malloc也可以更好地理解)

在许多malloc / free实现中,free通常不会将内存返回给操作系统(或者至少在极少数情况下)。原因是,你的堆中会出现间隙,因此它可能会发生,你只需要完成2或4 GB的虚拟内存。当然应该避免这种情况,因为一旦虚拟内存完成,你就会遇到很大麻烦。当然,另一个原因是操作系统只能处理特定大小和对齐的内存块。具体来说:通常操作系统只能处理虚拟内存管理器可以处理的块(最常见的是512字节的倍数,例如4KB)。

因此返回40字节到操作系统将无法正常工作。那么免费做什么呢?

Free会将内存块放在自己的空闲阻止列表中。通常它也会尝试将地址空间中的相邻块融合在一起。空闲块列表只是一个内存块的循环列表,当然在开头有一些管理数据。这也是为什么用标准malloc / free管理非常小的内存元素效率不高的原因。每个内存块都需要额外的数据,而更小的内存会发生更多碎片。

free-list也是第一个位置,malloc在需要时查找新的内存块。它在从OS调用新内存之前进行扫描。当发现一个比所需内存大的块时,它只分为两部分。一个返回给调用者,另一个返回到空闲列表中。

发布:Cocoa使用某些命名约定。任何以alloc,new或copy开头的东西都会返回一个retainCount为1的东西,你需要释放。当调用release时,reatinCount减少1