La comprobación de la devolución de malloc
no le ayuda mucho por sí solo para que sus asignaciones sean más seguras o menos propensas a errores. Incluso puede ser una trampa si esta es la única prueba que implementa.
Cuando se invoca con un argumento de 0
, la norma permite malloc
devolver un tipo de dirección única, que no es un puntero nulo y al que no tiene derecho de acceso, sin embargo. Por lo tanto, si solo prueba si el resultado es 0
pero no prueba los argumentos en malloc
, calloc
o realloc
, es posible que encuentre un segfault mucho más tarde.
Esta condición de error (memoria agotada) es bastante rara en entornos "alojados". Por lo general, tienes problemas mucho antes de que te molestes con este tipo de error. (Pero si está escribiendo librerías en tiempo de ejecución, es un kernel hacker o un generador de cohetes, esto es diferente, y allí la prueba tiene perfecto sentido)
Las personas tienden a decorar su código con capturas complicadas de esa condición de error que abarcan varios líneas, haciendo perror
y cosas así, que pueden tener un impacto en la legibilidad del código.
Creo que este "comprobar el retorno de malloc
" está muy sobreestimado, a veces incluso defendido de forma bastante dogmática. Otras cosas son mucho más importantes:
- siempre inicializar variables, siempre. para las variables del puntero esto es crucial, deje que el programa se cuelgue bien antes de que las cosas se pongan feas. los miembros punteros no inicializados en
struct
s son una causa importante de errores que son difíciles de encontrar.
- Compruebe siempre el argumento para
malloc
y compañía si esto es una constante de tiempo de compilación como sizof toto
no puede haber un problema, pero siempre asegurarse de que su vector de asignación maneja el caso cero correctamente.
Una cosa fácil de comprobar si hay retorno de malloc
es envolverlo con algo como memset(malloc(n), 0, 1)
. Esto solo escribe un 0
en el primer byte y se bloquea muy bien si malloc
tuvo un error o n
fue 0
para empezar.
Creo que no debe usar malloc en C++: http://stackoverflow.com/questions/184537/in-what-cases-do-i-use-malloc-vs-new – lc2817
@ lc2817 solo debe usar malloc si está escribiendo código con una interfaz C (es decir, funciones que se utilizarán desde C pero escritas en C++) ** y ** el código C es responsable de liberar esa memoria. –
@WTP gracias por esta precisión. Aunque, no sé si es el caso aquí. – lc2817