memory - это - Нужно ли проверять NULL после выделения памяти, когда ядро использует память overcommit



malloc android-ndk (4)

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

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

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

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

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

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

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

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

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

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

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


Answer #1

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

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

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


Answer #2

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

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


Answer #3

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





android-ndk