Умный ответ будет «да, выделение памяти может быть неудачным по любой причине». Это может быть не то, что вы ищете.
Как правило, наличие в вашей системе свободной памяти не связано с успешным распределением. Скорее, вопрос заключается в том, имеет ли адресное пространство вашего процесса свободное виртуальное адресное пространство .
Распределитель (malloc
, operator new
, ...) сначала проверяет, есть ли в текущем процессе свободное адресное пространство, которое уже сопоставлено , то есть ядро знает, что адреса должны быть пригодными для использования. Если есть, это адресное пространство зарезервировано в распределителе и возвращено.
В противном случае ядру предлагается сопоставить новое адресное пространство с процессом. Это может завершиться неудачно, но обычно этого не происходит, поскольку отображение еще не подразумевает использование физической памяти - это просто обещание, что, если кто-то попытается получить доступ к этому адресу, ядро попытается найти физическую память и настройте таблицы MMU так, чтобы виртуальный-> физический перевод нашел его.
Когда системе не хватает памяти, физической памяти не остается, процесс приостанавливается, и ядро пытается освободить физическую память, перемещая память других процессов на диск. Приложение не замечает этого, за исключением того, что выполнение одной инструкции на ассемблере, очевидно, заняло много времени.
Распределение памяти в процессе завершается неудачно, если не существует свободной области сопоставления, и ядро отказывается устанавливать сопоставление. Например, не все виртуальные адреса могут использоваться, так как большинство операционных систем отображают ядро по какому-либо адресу (обычно 0x80000000, 0xc0000000, 0xe0000000 или что-то подобное на 32-разрядных архитектурах), поэтому существует ограничение на процесс, которое может быть ниже, чем ограничение системы (например, 32-разрядный процесс в Windows может выделить только 2 ГБ, даже если система является 64-разрядной). Отображения файлов (такие как сама программа и библиотеки DLL) еще больше сокращают доступное пространство.