![](/img/trans.png)
[英]Expo app working on Expo Go and iOS Simulator but crashes on real device
[英]free() working with iOS Simulator but not on real device
- (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。 如何在真實設備上釋放內存?
您發布的代碼看起來不錯,但是您可能會發現檢測進程正在使用的內存量的方法有問題。
通常,從操作系統分配給進程的內存不會返回到操作系統(直到進程退出),而是由進程保存在空閑池中,以防萬一您再次需要它,例如:
+----------------+
| process |
| (malloc) |
| ^ |
| | |
| v |
| +-----------+ | +------------------+
| | free pool |<-+--| Operating system |
| +-----------+ | +------------------+
+----------------+
因此,如果要測量該進程使用的內存,則在分配內存時它將增加(大約)128M,但釋放時不會減少。
您可以通過簡單地再次分配內存來查看進程空間是增加還是保持在首次達到的水平,從而間接地測試這一點。
您還可以在代碼中添加調試語句,以確保正確調用calloc
和free
的次數,並在正確情況下使用有效的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.