Pregunta

Por ejemplo:

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

¿Hay efectos secundarios adversos de hacer esto?

¿Fue útil?

Solución

Aquí está el capítulo y el verso.

  

Si el argumento [a la función libre ] no coincide con un puntero devuelto anteriormente por calloc , malloc , o   Función realloc , o si el espacio ha sido desasignado por una llamada a free o realloc ,   El comportamiento es indefinido. ( ISO 9899: 1999 - Lenguajes de programación & # 8212; C , Sección 7.20.3.2)

Otros consejos

Fallo de segmentación, corrupción de la memoria silenciosa o de una sola cosa.

Sí, puede obtener un doble error gratuito que hace que su programa se bloquee. Tiene que ver con las estructuras de datos internas de malloc para realizar un seguimiento de la memoria asignada.

Resumen de respuestas:

Sí, las cosas malas pueden y probablemente sucederán.

Para evitar esto haz:

free(myString);
myString = NULL;

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

Además, al llamar a free () con un NULL no se produce ninguna acción. Para obtener más información, consulte: man free

No es tan inteligente. Google para el doble de vulnerabilidades libres. Establezca su puntero en NULL después de liberar para evitar este tipo de errores.

Según el sistema en que lo ejecutes, no pasará nada, el programa se bloqueará, la memoria se dañará o cualquier otro número de efectos interesantes.

Siempre establece un puntero a NULL después de liberarlo. Es seguro intentar liberar un puntero nulo.

Vale la pena escribir tu propio contenedor gratuito para hacer esto automáticamente.

(potencialmente) hace que los demonios salgan volando de tu nariz .

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

Bad Things (TM)

Realmente, creo que está indefinido, por lo que es algo que incluye jugar " Global Thermonuclear War " con el mainframe de NORAD

Puede bloquear tu programa, corromper la memoria o tener otros efectos negativos más sutiles. Después de eliminar la memoria, es una buena idea establecerla en NULL (0). Intentar liberar un puntero nulo no hace nada, y se garantiza que es seguro. Lo mismo es válido para eliminar en c ++.

En resumen: " Comportamiento indefinido " ;.

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

La macro que se reconoce 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 la memoria silenciosamente. / p>

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

El bucle do-while es para ayudar al código circundante a digerir más fácilmente las declaraciones múltiples. p.ej. si (hecho) my_free (x);

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;
}

//?!? :)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top