我想在内存压力下重现我的应用程序的崩溃错误,所以我想在我的应用程序启动时分配大量内存,并期望它在内存压力下。我使用下面的代码:
void *p[300];
NSInteger allocatedMB = 0;
for (int i = 0; i < 300; i++) {
p[allocatedMB] = malloc(1024 * 1024);
memset(p[allocatedMB], 0, 1024 * 1024);
allocatedMB += 1;
}
我希望能够分配300M内存,而且永远不会释放它。但我总是在我的iPhone上得到这个结果:
它仅分配150M,之后将其释放到仅71M。但它在模拟器中看起来像我期望的那样:
我对此不太清楚,任何答案都会被理解为什么以及如何在我的iPhone上执行此操作!
答案 0 :(得分:1)
malloc
分配的内存未自动释放。如果你不打电话给free
,它就会泄漏。在仪器的“分配”工具中观察这两种情况,您将看到堆积峰值增加300 mb而不会降低(在设备和模拟器中)。
Xcode调试器中的内存视图显然没有显示所有内容。事实上,我无法让它在模拟器或设备中向我展示300mb。但仪器向我展示了它。 (虽然,当我在设备上运行仪器分配工具时,但泄漏工具不起作用。其他人也报告了这个问题。)
答案 1 :(得分:0)
很可能代码正在优化,因为编译器可以证明永远不会访问p
,因此它实际上不需要调用memset
。
尝试制作指针volatile
:void volatile *p[300];