Teóricamente puedo decir que

free(ptr);
free(ptr); 

es una corrupción de memoria ya que estamos liberando la memoria que ya ha sido liberada.

Pero lo que si

free(ptr);
ptr=NULL;
free(ptr); 

Como el sistema operativo se comportan de manera indefinida no puedo conseguir un real análisis teórico de este acerca de lo que está sucediendo.
Lo que estoy haciendo, es esta corrupción de memoria o no?

Es liberar a un puntero NULO válido?

  • no estoy seguro acerca de C estándar, pero en C++ eliminar(NULL) es perfectamente válido, por lo que supongo libre(NULL) también debería ser.
  • delete NULL no es válido en C++. eliminar puede ser aplicado a null-valores de puntero de tipo concreto, pero no a NULL. delete (int*) NULL es legal, pero no delete NULL.
  • así que esto significa que si un puntero que apunta a NULL libre de no hacer nada.significa eso!!!!!! cada vez que en nuestro código si desea liberar memoria puede simplemente reemplazar un free(ptr) con ptr=NULL?
  • No. Si ptr apunta a la memoria, y que no llame la free, entonces, la memoria de fugas. Ajuste a NULL sólo pierde su asidero en la memoria, y las fugas. Si el ptr pasa a ser NULL, llamando free es un no-operaciones.
  • Eh? ¿Qué le hizo a la conclusión de que puede reemplazar free(ptr) con ptr = NULL. Nadie dijo nada de eso.
  • libre no libre de la variable que se pasa en, libera un bloque de memoria previamente asignados y referenciado por el puntero de valor en el valor pasado. Así, ptr no se libera, el bloque apuntado por ptr está siendo liberado.
  • Duplicado: stackoverflow.com/questions/1879550/…

InformationsquelleAutor Vijay | 2009-12-21

10 Comentarios

  1. 210

    7.20.3.2 La free función

    Sinopsis

    #include <stdlib.h> 
    void free(void *ptr); 

    Descripción

    La free función hace que el espacio señalado por ptr cancelar la asignación, es decir,
    disponible para la nueva asignación. Si ptr es un puntero null, acción que no se produce.

    Ver ISO-IEC 9899.

    Que se dice, cuando se busca en diferentes códigos base en la naturaleza, notarás que a veces las personas hacen:

    if (ptr)
      free(ptr);

    Esto es debido a que algunos C tiempos de ejecución (yo seguro que recuerdo que era el caso en PalmOS) podría bloquearse cuando la liberación de un NULL puntero.

    Pero a día de hoy, creo que es seguro asumir que free(NULL) es un nop como se indica por la norma.

    • así que esto significa que si un puntero que apunta a NULL libre de no hacer nada.significa eso!!!!!! cada vez que en nuestro código si desea liberar memoria puede simplemente reemplazar un free(ptr) con ptr=NULL?
    • No, ptr=NULL es de ninguna manera un sustituto para free(ptr), ambos son completamente diferentes
    • NO, significa que free(ptr) donde ptr es nulo y no tiene efectos secundarios. Pero, en cualquier caso, toda la memoria asignada usando malloc() o calloc() debe ser liberado después de usar free()
    • ptr=NULL asegura que incluso si accidentalmente llamada free(ptr) su programa no violación de segmento.
    • Usted no necesita preguntar a su pregunta varias veces. Editar tu pregunta post y anexar la información que desea.
    • Por favor, tenga en cuenta que aunque el estándar de C, dice que es un no-op, eso no quiere decir que todos los C-biblioteca se encarga de eso. He visto que se bloquea de forma gratuita(NULL), por lo que es mejor para evitar llamar la libre en el primer lugar.
    • evite llamar gratis? ¿Cómo liberar tu memoria?
    • él se refiere a evitar free(NULL) por probar el puntero en contra de NULL antes de llamar a free()
    • ah, eso tiene sentido. Lo Siento 😀

  2. 20

    Todos los estándares compatible con las versiones de la biblioteca de C de tratar libre(NULL), como un no-op.

    Que dijo, en un momento hubo algunas versiones libres que podrían bloquearse en libre(NULL), que es la razón por la que usted puede ver algunos defensiva técnicas de programación recomienda:

    if (ptr != NULL)
        free(ptr);
    • -1 [cita requerida]. Cambiar el código de estilo, porque de alguna teoría de una arcaica rumores aplicación es una mala idea.
    • Nunca me recomienda cambiar el estilo, simplemente me explicó por qué usted todavía puede ver esta recomendación en algunos estilos.
    • 3BSD (winehq.org/pipermail/wine-patches/2006-October/031544.html) y de PalmOS para dos (de 2ª mano para tanto).
    • el problema era que en cosas como la Versión 7 de Unix. Cuando yo estaba aprendiendo, libre(xyz) donde xyz == NULL era una receta para el instante de desastres en la máquina donde aprendí (ICL Perq ejecución PNX, que se basa en la Versión 7 de Unix con algún Sistema III extras). Pero yo no he código de esa manera por un largo tiempo.
    • Netware se bloquea en la libre-ing NULL demasiado… (sólo depurando un accidente en ello…)
    • Es por eso que se suspenden? LOL
    • «Todos los estándares compatible con las versiones de la biblioteca de C de tratar libre(NULL), como un no-op» – Algunos no cumplen, también lo hacen. Por ejemplo, glibc carece de la más segura de las funciones de cadena de TR-24731, por lo que no conformes; pero sí que permite liberar un NULL ptr y la tratará como un nop. Drepper personalmente se opone a la más segura de las funciones de cadena para glibc es probable que nunca se cumple.
    • Drepper no ha sido el encargado de glibc desde el año 2012. Sin embargo, hay muchas personas que están de acuerdo con él en cuanto a la (falta de) de la utilidad de las funciones de cadena en TR-24731. También C11 Anexo K (TR-24731) es opcional, así que glibc no es que no los cumple para omitirla. Por último, hay serias propuestas para eliminar el Anexo K de la siguiente estándar; consulte N1967 presentado a WG14. Que requieren libre(NULL) para ser un no-op fue parte de la primera ANSI C 1989/ISO C 1990, lo que hay sin tiempo de ejecución de C compatible con alguna versión del estándar de C que no lo admite.

  3. 12

    Si ptr es NULL, no se realiza ninguna operación.

    dice la documentación.

    • hacer u significa que el libre albedrío no hacer nada?
    • benjamin, que es exactamente lo que significa. ¿Qué le espera a realizar, si es consciente de nullness de la discusión?
  4. 10

    Recuerdo de trabajo en PalmOS de donde free(NULL) se estrelló.

    • Interesante, hace una segunda plataforma (después de 3BSD) que los accidentes de tráfico.
    • Si no recuerdo mal, en la Palma de la Biblioteca Estándar de C no existe. En cambio, hubo una mayoría de los no admitidos archivo de encabezado que se asignan de la biblioteca estándar de llamadas a través de la Palm OS SDK. Un montón de cosas actuado de forma inesperada. De estrellarse en el NULL fue uno de los grandes de la ejecución de las diferencias de la Palma de caja de herramientas en comparación con el estándar de la biblioteca.
  5. 8
    free(ptr);
    ptr=NULL;
    free(ptr);/*This is perfectly safe */

    Usted puede eliminar de forma segura un puntero NULL. Ninguna operación se realiza en ese caso.En otras palabras free() no hace nada en un puntero NULO.

  6. 8

    Recomendada de uso:

    free(ptr);
    ptr = NULL;

    Ver:

    man free
    
         The free() function deallocates the memory allocation pointed to by ptr.
         If ptr is a NULL pointer, no operation is performed.

    Cuando se establece el puntero a NULL después de free() puede llamar free() de nuevo y no se permitirá ninguna operación realizada.

    • Que también ayudan a detectar las segfaults con un depurador. Es evidente que la violación de segmento en p>do() con p=0 es alguien a través de un liberado puntero. Menos evidente cuando vea p=0xbfade12 en el depurador 🙂
  7. 6

    free(NULL) es perfectamente legal en C, así como delete (void *)0 y delete[] (void *)0 son legales en C++.

    Por CIERTO, liberando a la memoria dos veces generalmente produce algún tipo de error en tiempo de ejecución, por lo que no corruptos nada.

    • delete 0 no es legal en C++. delete explícitamente requiere una expresión de tipo puntero. Es legal para aplicar delete a un tipo de apuntador null valor, pero no 0 (y no NULL).
    • Sí, fijo fragmentos.
    • No se puede eliminar void* o 😛 Que los destructores(s) debe ejecutarse?
    • Que puede eliminar void * como siempre que sea de un apuntador null.
    • Ok, justo lo suficiente. Se me olvidó sólo estamos tratando específicamente con null.
    • no suele corromper cualquier cosa, pero no se garantiza. ASLR hace de este lugar raro, pero todavía no imposible: buf1=malloc(X); free(buf1);buf2=malloc(X);free(buf1); – aquí si has tenido mala suerte, buf2 tengo exactamente la misma dirección como buf1, y accidentalmente libera buf1 dos veces, por lo que en la 2ª libre de buf1 usted realmente liberados buf2 en silencio, sin casuing cualquier (immidate) error/crash/lo que sea. (pero probablemente usted todavía obtener un accidente próxima vez que intente utilizar buf2 – y este escenario es muy poco probable si se está ejecutando en ASLR)

  8. 3

    free(ptr) es guardar en C si ptr es NULL, sin embargo, lo que la mayoría de la gente no sabe es que NULL no tiene que ser igual a 0. Tengo un buen de la vieja escuela de ejemplo: En el C64, en la dirección 0, hay un IO-Puerto. Si usted escribió un programa en C el acceso a este puerto, se necesita un puntero cuyo valor es 0. La correspondiente biblioteca C habría que distinguir entre 0 y NULL entonces.

    Saludos.

    • Hecho interesante, me cogió por sorpresa. Me hizo sentir obligado a tomar un viaje alrededor de puntero NULO de preguntas/respuestas.
  9. -1

    ptr apunta a algunos ubicación de memoria, digamos 0x100.

    Cuando free(ptr), básicamente, usted está permitiendo que 0x100 para ser utilizado por el administrador de memoria para ser utilizado para otra actividad o proceso y en palabras simples es la desasignación de los recursos.

    Al hacer ptr=NULL, usted está haciendo ptr punto a la nueva ubicación(permite no preocuparse por lo que es NULO). Haciendo esto usted perdido la pista de la 0x100 los datos de la memoria.Esto es lo que es la pérdida de memoria.

    Por lo que no es aconsejable el uso de ptr=NULL en un ptr válido.

    Lugar que usted podría hacer algún seguro de verificación mediante el uso de :

    if(ptr != NULL)
    {free(ptr);}

    Cuando free(ptr) donde ptr ya está apuntando a NULL, se realiza ninguna operación.Por lo tanto, su seguro hacerlo.

Dejar respuesta

Please enter your comment!
Please enter your name here