一个内存块能否被部分释放?

3
我正在编写一个非常占用内存的程序,其中会有几十个已分配的数组。当应用程序接收到低内存警告时,我想要释放这些数组的下半部分。是否有任何方法可以做到这一点?
我需要一种方式来保留每个数组中的一半内存。显然,如果应用程序内存不足,我不能分配一个较小的数组,将我的数据复制到其中,然后释放旧数组。是否有任何函数可以释放从指针A开始到指针B结束的内存块或类似的操作?
2个回答

2

realloc()函数可以将malloc分配的内存中未被使用的部分返回给内存池,但无法将其返回给操作系统。

realloc()也无法解决内存碎片问题,这在低内存情况下很可能会成为问题。


2
使用realloc()。它会减小你为其分配的内存块的大小。不必担心碎片化问题;操作系统的内存分配器会处理它。如果你在一个更简单的操作系统上,这可能是一个更大的问题,但iOS有一个非常先进的分配器。 - Ryan

0
如果它们是NSMutableArrays,您可以使用单个[NSNull null]实例替换底部的对象,从而释放所有这些对象。

NSNull类参考


1
[NSNull null]填充数组不会改变数组的长度,反而会创建一种奇怪的情况。最好调用[mutableArray removeObjectsInRange:NSMakeRange(indexOfFirstObjectToRemove, [mutableArray count] - indexOfFirstObjectToRemove)]。这将释放那些对象并正确地调整数组大小。 - Ryan
不,它不会释放数组内存,但会释放对象,其占用的空间可能比指向它们的指针要大得多。是的,删除它们更好!我想也许他出于某种原因想保留它们的索引(不知道为什么我会这样想-可能我默认他在使用表视图)。 - bshirley
可变数组在任何时候都不会重新占用末尾空间,我认为是这样的。 - bshirley
我不确定它是否重新获取了空间,因为文档中没有指明。如果确实如此,那么这是一项实现细节,不应该依赖它。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接