C、Xcode 和内存

标签 c xcode memory memory-management memory-leaks

为什么在执行下一个 C 代码后 Xcode 显示比原来多 20KB?

void *p = malloc(sizeof(int)*1000);
free(p);

我是否必须以其他方式释放内存?或者这只是一个 Xcode 错误?

最佳答案

当您说“Xcode 显示比原来多 20KB”时,我猜您的意思是小条形图增加了 20kB。

当您 malloc 一个对象时,C 库首先检查进程的地址空间,看是否有足够的可用空间来满足请求。如果没有足够的内存,它会去操作系统请求更多的虚拟内存分配给进程。 Xcode 中的图形测量进程拥有的虚拟内存量。

当你释放一个对象时,内存永远不会返回给操作系统,相反,它“只是”放在空闲 block 列表中供 malloc 重用。我把“just”这个词用引号引起来,因为实际的算法可能非常复杂,目的是尽量减少堆的碎片以及 malloc 和 free block 所花费的时间。内存永远不会返回给操作系统的原因是对操作系统进行系统调用以获取和释放内存的成本非常高。

因此,您永远不会看到进程的内存使用量下降。如果您 malloc 1 GB 的内存然后释放它,该进程看起来仍会使用 1 GB 的虚拟内存。

如果你想看看你的程序是否真的泄漏,你需要使用泄漏分析工具。这会拦截 malloc 和 free 调用,因此它知道哪些 block 名义上仍在使用,哪些已被释放。

关于C、Xcode 和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32499181/

相关文章:

检查两个数组是否相等 - C

c - 将接收到的参数传递给回调函数

objective-c - Game Center调用排行榜功能没有响应?

javascript - Chrome 内存/垃圾收集问题

python - 尽管使用了allow_growth=True,为什么keras model.fit 使用了这么多内存?

java - 有什么方法可以在任何更新时从 Flash Air 卡向 Android 应用程序发送通知?

c - 交替位置&否定。使用 For 循环在几何级数中

c - 推荐学习C

javascript - YGDisplay 'inline ' 无效。应该是 : ( flex, 之一(无)

c++ - cuda 共享内存 - 结果不一致