if (p)
free(p);
qué otra comprobación explícita?
Si que escribo algo por el estilo, es transmitir el conocimiento específico que el puntero puede ser NULL ... para ayudar en la lectura y comprensión del código. Porque se ve un poco raro para hacer que una aserción:
assert(p || !p);
free(p);
(Más allá de aspecto extraño, se sabe que los compiladores a quejarse de "condición siempre es cierto" si a su vez sus advertencias en muchos de estos casos.)
Así que lo veo como una buena práctica, si no está claro desde el contexto.
el caso contrario, de ser espera un puntero a ser no nula, suele ser evidente a partir de las anteriores líneas de código:
...
Unhinge_Widgets(p->widgets);
free(p); // why `assert(p)`...you just dereferenced it!
...
Pero si es no evidente, teniendo la aserción puede valer la pena los caracteres escritos
¿Porque la gente no conoce el estándar C? –
Duplicado, ish of http://stackoverflow.com/questions/615355/is-there-any-reason-to-check-for-a-null-pointer-before-deleting – McPherrinM
WaffleMatt: eso es sobre C++ (y no C++ tag :-() - my es C, por lo que es un poco diferente. C++ es más nuevo así que tal vez los "viejos hábitos" tienen menos tracción allí – zaharpopov