2010-07-29 13 views
7

Duplicar posible:
Setting variable to NULL after free …¿Es siempre una buena práctica establecer punteros a NULL después de liberarlos()?

estoy aprendiendo acerca de las buenas prácticas de programación C y mi amigo me dijo que siempre para configurar los punteros a NULL después de liberación() ing ellos (o llamar a un función de liberación específica).

Por ejemplo:

char* ptr = malloc(100); 
... 
free(ptr); 
ptr = NULL; 

o

struct graph* graph = create_graph(); 
... 
destroy_graph(graph); 
graph = NULL; 

Por qué es una buena práctica?

Actualización: ¡Después de leer las respuestas, me parece una práctica horrible! Estoy ocultando posibles errores double-free(). ¿Cómo puede ser esta una buena práctica? Estoy impactado.

Gracias, Boda Cydo.

+0

@bodacydo Eche un vistazo a las preguntas "relacionadas" a la derecha de la página. –

+0

Gracias Neil y Michael. Esa pregunta realmente responde mi pregunta. Después de leer las respuestas, tengo otra pregunta: ¿no ocultar los punteros a NULL realmente oculta los errores? Double free() ya no se detecta! Ahora estoy confundido, ya que esto realmente oculta los errores para aparecer. – bodacydo

+1

¿Cómo es eso? Liberar un puntero y establecerlo en NULL permite liberar la memoria. Si luego decides liberar NULL, deberías obtener una afirmación o alguna otra advertencia.La memoria de doble liberación es mucho más difícil de rastrear que la liberación de NULL. –

Respuesta

2

Mala votación de mi parte. Si do desea asignar un valor, configúrelo en (void *) 0xdeadbeef. Sin embargo, compruebe lo que su CRT puede hacer primero. Un asignador de depuración decente configurará la memoria liberada para un patrón que pueda causar una bomba cuando se utiliza el puntero después de que se liberó. Aunque eso no está garantizado. Pero luego no cambiar el valor del puntero es la mejor solución (y más rápida).

-5

Creo que sí ...

Cuando haya terminado de utilizar una parte de menory, que debe liberar() it.This permite que la memoria liberada que se utilizará para algunos otros propósitos ... como más malloc () llamadas.

libre toma un puntero a la memoria como un argumento y libera la memoria a la que el puntero se refiere a ...

Espero que esto ayude ... :)

+5

-1: Esto no responde la pregunta. bodacydo no preguntaba si debería liberar memoria. Él estaba preguntando, ¿debería establecer los punteros a NULL después de liberarlo? –

6

Esto se considera una buena práctica algunos porque le impide acceder accidentalmente a la memoria después de que haya sido liberada() ed.

+1

Después de leer las respuestas, me pareció una mala práctica: ¡estoy ocultando errores de doble gratis! ¿Cómo puede ser esta una buena práctica? – bodacydo

+1

En realidad, no le impide automáticamente acceder a él, pero puede (y debe) siempre verificar con punteros nulos, pero no puede decir si un puntero no nulo es válido. Por lo tanto, es una buena práctica. – cypheon

+0

Todavía no estoy convencido de que sea una buena práctica. – bodacydo

13

Si bien no puede doler, no siempre ayuda. El problema a considerar es que es fácil que haya múltiples copias del puntero y lo más probable es que solo establezca una sola en NULL. El ejemplo clásico de donde no ayuda en absoluto es:

void free_graph(graph *g) 
{ 
    ... 
    free(g); 
    g = NULL; // not useful in this context 
} 

El problema aquí es que sólo se va a configurar el puntero que es local a free_graph en NULL y el puntero está en manos de la persona que llama de free_graph se todavía tiene su valor original.

Cuestiones relacionadas