resueltos punteros memoria manejo ejercicios dinamicos dinamica asignacion arreglos c memory memory-management

memoria - punteros en c



¿Qué sucede cuando intentas liberar() la memoria ya liberada en c? (14)

Por ejemplo:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE); free(myString); free(myString);

¿Hay algún efecto secundario adverso de hacer esto?


Aquí está el capítulo y el versículo.

Si el argumento [de la función free ] no coincide con un puntero devuelto anteriormente por la función calloc , malloc o realloc , o si el espacio ha sido desasignado por una llamada a free o realloc , el comportamiento no está definido. ( ISO 9899: 1999 - Lenguajes de programación - C , Sección 7.20.3.2)


Dependiendo del sistema en el que lo ejecute, no ocurrirá nada, el programa se bloqueará, la memoria se dañará o cualquier otra cantidad de efectos interesantes.


En resumen: "Comportamiento indefinido".

(Ahora, qué puede incluir eso y por qué ese es el caso que los otros ya han dicho. Solo pensé que valía la pena mencionar aquí el término, ya que es bastante común).


Establezca siempre un puntero a NULL después de liberarlo. Es seguro intentar liberar un puntero nulo.

Vale la pena escribir su propio contenedor para hacerlo automáticamente.



La extraña macro que se muestra a continuación es un reemplazo útil para eliminar algunas clases de vulnerabilidades de seguridad, así como la depuración de la ayuda, ya que los accesos a las regiones libres son más propensos a segfault en lugar de corromper silenciosamente la memoria.

#define my_free(x) do { free(x); x = NULL; } while (0)

El ciclo do-while es para ayudar a que el código circundante digiera más fácilmente los enunciados múltiples. por ejemplo, si (hecho) my_free (x);


No hagas eso. Si la memoria que se liberó se vuelve a asignar a otra cosa entre las llamadas para free , entonces las cosas se desordenarán.


No tan inteligente. Google para vulnerabilidades gratuitas dobles. Establezca su puntero en NULL después de la liberación para evitar dichos errores.


Puede bloquear su programa, dañar la memoria o tener otros efectos negativos más sutiles. Después de eliminar la memoria, es una buena idea configurarla en NULL (0). Intentar liberar un puntero nulo no hace nada, y está garantizado que es seguro. Lo mismo vale para delete en c ++.


Resumen de respuesta:

Sí, las cosas malas pueden y probablemente sucedan.

Para evitar esto, haz lo siguiente:

free(myString); myString = NULL;

Tenga en cuenta que todas las referencias a la memoria deben establecerse en NULL si se crearon otras.

Además, al llamar a free() con un NULL produce ninguna acción. Para más información, vea: hombre gratis


Sí, puede obtener un doble error libre que hace que su programa falle. Tiene que ver con las estructuras internas de datos de malloc para hacer un seguimiento de la memoria asignada.


Uno de nada, corrupción de memoria silenciosa o falla de segmentación.


Cosas malas (TM)

Realmente, creo que no está definido, así que cualquier cosa, incluido el juego "Guerra Termonuclear Global" con la computadora central de NORAD


Otra situación interesante:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE); char * yourString = myString; if (myString) { free(myString); myString = NULL; } // Now this one is safe, because we keep to the rule for // setting pointers to NULL after deletion ... if (myString) { free(myString); myString = NULL; } // But what about this one: if (yourString) { free(yourString); yourString = NULL; } //?!? :)