Mejor no usar NULL en C++

Esta mañana me decía un compañero de faenas que era conveniente no usar NULL en C++, y mi curiosidad me llevó a preguntarle el porqué sin una respuesta convincente :).

Me puse a buscar una razón, la encontré y se la dije sin decirle que lo había leído en Internet, jejeje.

The pointer is initialised to 0, and not “NULL”. There is no such thing as “NULL” in C++, so the number 0 is what we have, and use. The reason is, oddly as it may seem, that C++ is much pickier than C about type correctness. Typically in C, “NULL” is defined as “(void*)0.” C++ never allows implicit conversion of a “void*” to any other pointer type, so this definition is not good enough. The integer 0, however, is implicitly convertible to any pointer type.

Como pone aquí, en C, NULL está definido como (void *)0 y C++ nunca permite una conversión implícita de un (void *) a cualquier otro tipo de puntero, por lo que no es bueno del todo usar NULLs cuando se programa en C++. Sin embargo, el entero 0 se puede convertir a cualquier tipo de puntero de forma implícita por lo que es más correcto.

Curiosidades de la vida que uno desconoce y conviene apuntarlas en un weblog :)

10 comentarios

Jeje, ya me decía yo “cuanto controla este”! :)

Comentario de David Currie | January 7th, 2005 21:10 | Permalink

Jajajaja, menudas risas nos hemos echado el Vaijira y yo mientras te lo explicaba, juazjauz.

El lunes hablamos. Saludines David.

Comentario de Cek | January 7th, 2005 21:26 | Permalink

joder. no sabes la de problemas que me dió jsuto esta mierda el mes pasado.
¡es cuando lo tenías que haber puesto! :P

Comentario de Zootropo | January 7th, 2005 21:39 | Permalink

Jajajaja, si lo hubiese sabido antes ….

Comentario de Cek | January 7th, 2005 22:04 | Permalink

Yo inicializaba a NULL los punteros que no sabía si se iban a utilizar, pero me parece que voy a cambiarlo ;)

Comentario de iOne | January 10th, 2005 22:04 | Permalink

Sí, en C++ es mejor cambiarlo ;)

Comentario de Cek | January 10th, 2005 23:43 | Permalink

Yo no los inicializaba porque, en un buen funcionamiento del programa, deberían iniciarse despues de una serie de sentencias condicionales (en el caso de que no se cumpla ninguna, la cosa no funcionaría). Pero como el compilador me daba warnings (por una posible no inicialización del puntero), lo puse a NULL.

Comentario de iOne | January 11th, 2005 09:30 | Permalink

Sí, yo también soy partidario de que el compilador no se queje :)

Comentario de Cek | January 11th, 2005 09:52 | Permalink

Precisamente lo interesante es que no haga la conversión de forma automática, es por ello por lo que se inicializan a NULL. Además, la inicialización debe realizarse obligatoriamente puesto que en C/C++ no se establece un valor por defecto en las variables (tener un puntero apuntando a no se sabe donde no es muy práctico y es cuanto menos peligroso).

Si inicializamos un puntero a NULL en C++ es posible transformarlo a cualquier otro tipo de puntero de forma explícita no implícita. Sin ir más lejos, es posible utilizar el malloc así:

int* vector = (int*)malloc(10*sizeof(int));

Y malloc devuelve un void*.

De todos modos, aunque sea void* existen conversiones automáticas: Es posible utilizar void* en una condición y retornará cierto (distinto de 0) si el puntero tiene valor, es decir, no es nulo. Y para ello lo que hace es compararlo con 0 como si fuese un entero.

Y para acabar, es mucho más claro un puntero NULL que un puntero 0. NULL es el valor no asignado mientras que 0 es la dirección de memoria 0.

Comentario de Pobrecito hablador | January 16th, 2005 17:31 | Permalink

Estoy contigo en que es más claro un valor no asignado que la dirección de memoria cero, pero C++ nunca permite una conversión implícita de un (void *) a cualquier otro tipo de puntero por lo que creo que es más claro inicializarlo a 0 (OJO: sólo en C++).

De todas formas tienes razón en tus planteamientos :)

Comentario de Cek | January 16th, 2005 19:59 | Permalink

Deja un comentario

XHTML: Puedes usar estos tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Previsualización del comentario

Comment by Somebody
Buscar
Categorías
all *BSD feed (5)
ADSL feed (6)
Apple feed (4)
Bases de Datos feed (8)
Bitácoras feed (64)
Charlas feed (3)
Chorradas feed (40)
Ciencia feed (9)
Cine feed (6)
CSS feed (8)
Deporte feed (11)
Diseño feed (12)
Educación feed (13)
English feed (2)
Estándares feed (19)
Gadgets feed (13)
Gastronomía feed (1)
Geek feed (23)
General feed (30)
GNU/Linux feed (81)
Hardware feed (20)
Internet feed (81)
Juegos feed (7)
Libros feed (20)
Licencias feed (17)
Manuales feed (24)
Música feed (18)
P2P feed (10)
Podcasting feed (2)
Política feed (43)
Programación feed (31)
Redes feed (19)
Salud feed (2)
Sistemas Operativos feed (57)
Tecnología feed (14)
Usabilidad feed (5)
Utilidades feed (30)
WEB feed (34)
Yo, mi, me, conmigo feed (26)
Archivos
Información
Enlaces
Administración
Sindicación
Estadísticas
Photolog

Gestionado con WordPress 2.3.1    Renderizado en 21 consultas y 0.602 segundos.    CleanBreeze Theme