ver valor vacio saber punteros estructura esta elemento declaracion datos como caracter arreglo array memory malloc android-ndk

memory - valor - ¿Hay una necesidad de verificar NULL después de asignar memoria, cuando kernel usa memoria de compromiso?



valor de null en c (5)

Es una práctica general verificar si NULL (si la memoria se ha asignado con éxito) después de un malloc (), algo así como

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

con la sobrecomision de memoria habilitada en kernel, ¿hay alguna posibilidad de obtener NULL? ¿Debo seguir la práctica de verificar religiosamente NULL para cada asignación? ¿Malloc devolverá NULL a pesar de un mecanismo agresivo de compromiso (supongo que valor 1)?

De hecho, el núcleo de Android usa la sobrecarga de memoria (no estoy seguro del valor, me encantaría saberlo (valor de compromiso) y su importancia). Parte del código fuente de código (C / C ++) en Android (puede ser de terceros) no verifica NULL ni captura bad_alloc después de las asignaciones. ¿Me estoy perdiendo de algo?

Hay algunos hilos en SO relacionados con la sobrecarga de memoria, pero ninguno de ellos resolvió mi confusión.

EDITAR: Si se emplea un compromiso excesivo agresivo, NULL no se devolverá (suposición 1). Cuando no hay memoria física disponible e intenta acceder a la memoria asignada (escriba en la memoria asignada), OOM anulará algún proceso y asignará memoria a la aplicación hasta que muera por turno (suposición 2). En cualquier caso, no veo ninguna necesidad de chequear NULL (se asigna la memoria o se mata el proceso). estoy en lo correcto en mis suposiciones?
La portabilidad no es una preocupación para esta pregunta.


Debe verificar el valor de retorno para NULL cada vez. Cualquier función de biblioteca puede fallar. Incluso fclose () do (en el recurso compartido desconectado de NFS, y el error de fclose del archivo NFS significa que esos datos no se guardaron).

La mayor parte del software está mal escrito y no contiene todos los controles.

malloc no puede devolver algo que no sea NULL o puntero. Todo o nada. No puede obtener 1 byte de malloc si solicita 10.


No, no es necesario verificar el resultado de malloc.

Mucho antes de que fallara el malloc, el sistema operativo ya había encontrado muchos problemas.


Sí, aún debes verificar si fallas devueltas por malloc . En un entorno que compromete la memoria en exceso, no podrá detectar y recuperarse de fallas debido a que el entorno se está quedando sin almacenamiento físico requerido cuando escribe en partes del espacio de direcciones que se asignaron a su programa mediante una llamada previa a malloc .

Sin embargo, este no es el único problema que haría que un malloc fallara en un entorno tradicional. Una solicitud de un bloque de memoria especialmente grande cuando el espacio de direcciones de su programa se ha fragmentado puede fallar incluso si hay suficiente memoria física total para satisfacer la solicitud. Como no hay un rango contiguo de espacio libre de direcciones, malloc debe fallar. Este tipo de falla debe ser señalada por malloc devuelve NULL , ya sea que el entorno exista o no una sobrecarga de memoria.


Sería aconsejable buscar NULL religiosamente en todas las llamadas a funciones que pueden devolver NULL, independientemente de si el kernel tiene o no memoria comprometible.

El siguiente segmento de código a continuación muestra cómo verificar si la llamada a malloc funcionó o no ...

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

Operaciones de archivo, operaciones de memoria para nombrar, pero algunas devolverán un NULL en caso de falla.

Espero que esto ayude, Saludos, Tom.


bueno ... en Linux ya que la memoria no está respaldada por páginas (inicialmente) y solo crea respaldo de página después de la primera lectura / escritura, el sistema operativo siempre tendrá éxito al proporcionarle memoria (a menos que agote el espacio de direcciones, algo imposible en sistemas de 64 bits) ) Entonces, si se queda sin memoria y no puede darle la memoria prometida, OOM killer simplemente matará su aplicación o alguna otra aplicación para darle la página que necesita. Entonces, ya sea que haga el cheque NULL o no, el resultado es el mismo, un choque .......