【问题标题】:free() working with iOS Simulator but not on real devicefree() 在 iOS 模拟器上工作,但不在真实设备上
【发布时间】:2014-09-03 22:47:04
【问题描述】:
- (void)viewDidLoad
{
    [super viewDidLoad];
    int Byte = 128 * 1000;
    char *po[Byte];
    for (int i = 0; i < Byte; i++){
        po[i] = (char *)calloc(1024, sizeof(char));
        if (po[i] == NULL) {
            printf("can not calloc.");
        }
    }
    sleep(1);
    for (int j = 0; j < Byte; j++){
        free(po[j]);
    }
}

模拟器保留内存然后调用 Free() 并按预期释放内存,但在真实设备上,它不是释放内存。它保留了 128MB。如何在真机上释放内存?

【问题讨论】:

  • 您在哪个设备上运行它? ios6 或 ios7
  • 你怎么知道不是释放内存?
  • 永远不要在主线程上调用sleep
  • 另外请注意,您正在使用 po 数组分配 512 KB 的堆栈空间(或在 64 位系统上为 1 MB)。虽然这本身并不算大,但很可能由于堆栈溢出而导致分段错误,尤其是在堆栈空间通常比主线程少的辅助线程上。
  • @milo 是的,我正在使用 ARC。

标签: ios objective-c memory ios-simulator free


【解决方案1】:

您发布的代码看起来不错,但您可能会发现您检测进程正在使用多少内存的方法有问题。

通常情况下,从操作系统分配给进程的内存不会返回给操作系统(直到进程退出),而是由进程保留在空闲池中,以防您再次需要它,例如:

+----------------+
| process        |
|    (malloc)    |
|       ^        |
|       |        |
|       v        |
| +-----------+  |  +------------------+
| | free pool |<-+--| Operating system |
| +-----------+  |  +------------------+
+----------------+

因此,如果您正在测量进程使用的内存,则在分配内存时它会增加(大约)128M,但在释放它时不会减少。

您可以通过简单地再次分配内存来间接测试这一点,以查看进程空间是否增加或保持在第一次达到的水平。

您还可以在代码中添加调试语句,以确保调用 callocfree 的次数正确,并且在后者的情况下使用有效的指针。

【讨论】:

    猜你喜欢
    • 2016-05-29
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2016-02-14
    • 2016-05-15
    • 1970-01-01
    • 2019-05-09
    • 2017-11-14
    相关资源
    最近更新 更多