1868
En la próxima conferencia QCon en Londres, el inventor del algoritmo quicksort, Tony Hoare, dará una charla con título "Null References: The Billion Dollar Mistake". Lo llama "su" error de mil millones de doláres, porque desde su introducción en 1965 estima que ha costado esa cantidad en errores y vulnerabilidades de todo tipo.
menéame
"Bill Gates, dará una charla con título "Windows vista: The Billion Dollar Mistake"
int a = 5;
int *const ptr = &a;
*ptr = 4;
int * mptr = const_cast<int*>(ptr);
mptr = 0;
EDITO: Dejo el comentario que alguien me ha votado positivo, pero este código aparte de hacer una aberración no es nada, que a fin de cuentas no estamos cambiando el valor de ptr como yo pensaba hacer
#include <string.h>
int main()
{
int a = 5;
int *const ptr = &a;
*ptr = 4;
memcpy(ptr,0x0,sizeof(int*));
}
(Compila con GCC, y da un pete de los que molan al ejecutar, claro).
PD: #6 GCC da error con eso
(léase con voz de comentarista radiofónico)
el NULL no es mala idea
Nota mental: Usar el Null Pointer en un pub como charla para romper el hielo con las chicas...oh wait, pensarian que soy un perturbado
(int*)ptr = NULL;
<quote>
Empty your memory,
with a free()...
like a pointer!
If you cast a pointer to a
integer,
it becomes the integer,
if you cast a pointer to a
struct,
it becomes the struct...
The pointer can crash...,
and can overflow...
Be a pointer my friend...
</quote>
(dicho con todo el amor del mundo :))
Pero odio los punteros que apuntan a basura y no son NULL
Si no estuviera permitido el puntero NULL, estariamos todo el día viendo código del estilo:
tipodatos OBJETO_TIPODATOS_NO_VALIDO;
tipodatos *funcion_tal( .... ) { ... }
...
if ( (ptr=function_tal(...)) == &OBJETO_TIPODATOS_NO_VALIDO )...
o por lo que dice #28, cualquier bug de acceso a miembros no inicializados seria mucho más difícil de seguir porque vete tu a saber por donde acabaría fallando
¿Y que sería de la programación sin el tipo de gente que se rie de la asignación manual de memoria e ignora que la máquina virtual de su lenguaje favorito está programada en C/C++?
No te creas, que hay gente que se gana su buen sueldo programando así.
Yo mismo me he dado mis buenos paseos por codeguru cuando de MFCs se trataba.
en.wikipedia.org/wiki/Resource_acquisition_is_initialization
En otras palabras, cuando declaras un puntero debes asignarle un valor y cuando haces free o delete debes resetearlo a NULL.
No es el santo grial, sino algo que todo programador descubre en algún momento. Cuando todo el mundo en el equipo es cuidadoso, ese tipo de problemas prácticamente desaparece.
www.youtube.com/watch?v=OW-cnizLDEE
"Vacía tu mente.
Libérate de las formas.
Como los punteros.
Pon una cadena en un puntero y será la cadena.
Pon un entero y será el entero.
El puntero puede ser referencia o puede ser asignado.
Sé un puntero, amigo."
en.wikipedia.org/wiki/Sentinel_node
así te evitas problemas con NULL, como desreferencias inválidas, "frees" incorrectos, etc.
int *const ptr;
int *const tmp = NULL;
memcpy(&ptr,&tmp,sizeof(int*));
Lo mejor de todo es que ningún profesor nos explico el principio del QS, solo nos lo enumeraron con el de la burbuja, ordenación directa, y no me acuerdo de mas nombres (casi han pasado 20 años). De estos nos explicaron como funcionaban.
Luego descubres el algosort, el sort o el sortalgo que te hace un QS transparente.
#34 en pascal, si mal no recuerdo y para la primera práctica de 1º una cola LIFO era un poco excesivo, porque no sabíamos ni lo que era una cola. Ni siquiera sabíamos que era recursividad que se daba en el segundo trimestre (para el 2º parcial).
metecola, sacacola, metecola, vaciacola
A lo mejor es porque tengo la mente contaminada por ASM y en C funciona de otra manera, pero... ¿El puntero NULL no es un puntero a 0x00000000? ¿Un puntero no es (En plataformas 32bits) un DWORD que contiene la dirección de memoria a la que apunta?
Si tenemos un puntero y lo rellenamos de ceros, ahora ese puntero apunta a 0x00000000, es decir, a NULL. ¿No?
String hola = null;
if(hola.equals("zasentoalaboca")){
....
....
}
Ya decía yo que era raro que en C funciona diferente que en ASM, siendo C tan cercano