Странное поведение распределения памяти iOS - PullRequest
5 голосов
/ 02 февраля 2011

Я заметил довольно странную вещь, пытаясь выделить много памяти на моем iPhone 3G под iOS 4.2.1.

Когда я вызываю malloc(512 * 1024) в цикле, он возвращает действительный указатель около 1500 раз, после чего я получаю NULL и

app(2032,0x3e7518b8) malloc: *** mmap(size=524288) failed (error code=12)
*** error: can't allocate region 

Это удивило меня, так как я думаю, что мойiPhone не имеет 750 МБ оперативной памяти.Затем я добавил memset после malloc, и это уменьшило количество выделений до 120, что имеет гораздо больше смысла.

Вот супер-простой код, который я использовал:

for (int i = 1; ; ++i)
{
    void *p = malloc(512 * 1024);
    NSLog(@"%d %p", i, p);
    memset(p, 0, 512 * 1024);
}

Хотя у iPhone не было системы виртуальной памяти, которая могла бы объяснить поведение, подобное этому.Что было бы разумным объяснением этого?

Ответы [ 2 ]

5 голосов
/ 02 февраля 2011

В iOS (и многих других системах) вызов malloc() фактически не выделяет память.Он запрашивает память у ОС / ядра, но запрос не выполняется до тех пор, пока память не будет записана (например, с memset().) Это позволяет повысить эффективность управления памятью системы, но может привести к неверному поведению malloc()..

2 голосов
/ 02 февраля 2011

В iPhone определенно установлена ​​система виртуальной памяти. Чего не хватает, так это возможности выкладывать память на диск. Другими словами, отсутствует пространство подкачки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...