Есть ли необходимость проверять наличие NULL после выделения памяти, когда ядро использует избыточную память

StackOverflow https://stackoverflow.com/questions/2248995

  •  20-09-2019
  •  | 
  •  

Вопрос

Обычной практикой является проверка на NULL (успешно ли выделена память) после malloc(), что-то вроде

void *ptr = malloc(10);    
if (ptr != NULL) {  
  // do some thing usefull  
} else {  
 // no memory. safely return/throw ...  
}  

при включенном превышении объема памяти в ядре, есть ли вероятность получения NULL?Должен ли я следовать практике неукоснительной проверки NULL для каждого распределения?Вернет ли malloc значение NULL, несмотря на агрессивный механизм overcommit (я предполагаю, значение 1)?

На самом деле ядро Android использует избыточную память (не уверен в значении, хотел бы знать это (избыточное значение) и его значение).Некоторый исходный код фреймворка (C / C ++) в Android (может быть сторонним) не проверяет наличие NULL и не улавливает bad_alloc после выделения.Я что-то упускаю?

В SO есть несколько тем, касающихся избыточной памяти, но ни одна из них не разрешила мою путаницу.

Редактировать: Если используется агрессивное превышение полномочий, значение NULL не будет возвращено (предположение 1).Когда нет доступной физической памяти и при попытке получить доступ к выделенной памяти (выполнить запись в выделенную память), ООМ завершает работу некоторого процесса и выделяет память для приложения до тех пор, пока оно не будет уничтожено в свою очередь (предположение 2).В любом случае я не вижу никакой необходимости проверять значение NULL (выделяется память или процесс завершается).прав ли я в своих предположениях?
Переносимость этого вопроса не имеет значения.

Это было полезно?

Решение

Да, вы все равно должны проверить наличие сбоев, возвращенных malloc.В среде с избыточным объемом памяти вы не сможете обнаруживать сбои и восстанавливаться после них из-за того, что в среде заканчивается физическая память, необходимая при записи в части адресного пространства, которые были выделены вашей программе предыдущим вызовом malloc.

Однако это не единственная проблема, которая могла бы вызвать malloc потерпеть неудачу в традиционной среде.Запрос на особенно большой блок памяти, когда адресное пространство вашей программы стало фрагментированным, может завершиться ошибкой, даже если потенциально общего объема физической памяти достаточно для удовлетворения запроса.Потому что нет непрерывного диапазона свободного адресного пространства malloc должен потерпеть неудачу.Этот тип сбоя должен быть сигнализирован malloc возвращающийся NULL, независимо от того, перегружает ли среда память или нет.

Другие советы

Вы должны проверить возвращаемое значение на NULL каждый время.Любая библиотечная функция может выйти из строя.Даже fclose() делают (на отключенном общем ресурсе NFS, и ошибка из-за fclose файла NFS означает, что данные не были сохранены).

Большая часть программного обеспечения плохо написана и не содержит всех проверок.

malloc не может возвращать ничего, кроме NULL или указателя.Все или ничего.Вы не сможете получить 1 байт из malloc, если запросите 10.

Было бы целесообразно тщательно проверять наличие NULL во всех вызовах функций, которые могут возвращать NULL, независимо от того, имеет ли ядро избыточную память или нет.

В следующем фрагменте кода ниже показано, как проверить, выполняется ли вызов malloc сработало или нет...

void *ptr = malloc(10);
if (ptr != NULL){
   /* Do something here with ptr */
}else{
   /* Do something here if it fails */
}

Операции с файлами, операции с памятью, чтобы назвать лишь некоторые из них, вернут значение NULL при сбое.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

что ж ... в Linux, поскольку память не поддерживается страницей (изначально) и создает резервную копию страницы только после первого чтения / записи, ОС всегда сможет предоставить вам память (если вы не исчерпали адресное пространство, что невозможно в 64-разрядных системах).Поэтому, если у него заканчивается память и он не может предоставить вам обещанную память, OOM killer просто убьет ваше приложение или какое-либо другое приложение, чтобы предоставить вам необходимую поддержку страницы.Таким образом, независимо от того, выполняете вы проверку на НУЛЬ или нет, результат один и тот же - сбой.......

Нет, нет необходимости проверять результат malloc.

Задолго до того, как malloc вышел из строя, операционная система уже столкнулась с множеством проблем.

"ООМ-Киллер и чрезмерная самоотверженность" были бы лучшим выбором.

Что?Ваша операционная система не поддерживает "ООМ-киллер и перегрузку"?

Вот почему вам следует переключиться на Linux (или Android)!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top