Digamos que tengo el siguiente código C:

int main () {
  int *p = malloc(10 * sizeof *p);
  *p = 42;
  return 0;  //Exiting without freeing the allocated memory
}

Al compilar y ejecutar ese programa en C, es decir, después de la asignación de espacio en la memoria, se que la memoria me asignados ser todavía asignado (es decir, básicamente, ocupando espacio) después de que yo salga de la aplicación y el proceso termina?

  • es el «buen estilo» para limpiar su memoria, porque no se puede ejecutar en un sistema operativo que no tiene memoria protegida (que es la principal sugerencia que aparece a continuación), sino porque aumenta la probabilidad de que usted va a encontrar fugas de memoria, y mantiene el código lean y correcta…

9 Comentarios

  1. 104

    Depende del sistema operativo. La mayoría de los modernos (y de todos los principales sistemas operativos va a liberar la memoria no se libera por el programa cuando termina.

    Confiando en que esto es una mala práctica y lo mejor es gratis de forma explícita. El problema no es sólo que el código se ve mal. Usted puede decidir que usted desea integrar a su pequeño programa en una más grande, de largo ejecutando uno. Luego de un rato más tarde, usted tiene que pasar horas localizar pérdidas de memoria.

    Basándose en una característica de un sistema operativo también hace que el código sea más portátil.

    • Yo una vez encontrado win98 en una plataforma embebida, y basados en esa experiencia, puedo decir que NO libera la memoria cuando los programas de cerrar.
    • «Usted puede decidir que quiere …» -, pero comparar: YAGNI.
    • Realmente no es trabajo para liberar recursos.
    • Fue un ejemplo. También, hay una línea entre YAGNI y descuidado de codificación. No liberar los recursos de la cruza. El principio YAGNI también fue diseñada para ser aplicada a las características, no el código que hace que el programa funcione correctamente. (Y no liberar memoria es un error).
    • +1: la cosa más importante a considerar es que la gestión de la memoria es como Yacoby muy acertadamente: «una de las características del sistema operativo». A menos que me equivoco, el lenguaje de programación no define lo que sucede antes o después de la ejecución del programa.
    • la evidencia anecdótica por qué explícitamente liberando puede ser malo: me escribió una utilidad de línea de comandos que construyó una enorme lista enlazada; liberar a los nodos de salida de retraso de la finalización del programa por varios segundos(!), considerando que de no hacerlo así, permitió que el OS para reclamar la memoria a granel…
    • Me resulta extraño que el sistema operativo podría liberar una gran lista vinculada de manera tan rápida, como la memoria que la lista ocupa no estaría en la alineación como una gran matriz sería y, como tal, esto parece que podría causar problemas de rendimiento. Por qué no es éste el caso?
    • Los sistemas operativos que admiten memoria virtual no ir a través de los problemas de liberar la memoria. Es virtual, no sólo deja de ser.
    • D. Shawley: El lenguaje de programación no define las llamadas al sistema o sistemas de ficheros, ya sea. Un programa que sólo se utiliza exactamente lo que el lenguaje de programación especificación define es totalmente portátil, y prácticamente inútil.
    • Liberar memoria de forma manual toma más tiempo, tiene más de código, y se introduce la posibilidad de errores (me digas que nunca has visto un error en la desasignación de código!). No se trata de «descuidado» intencionalmente omite algo que es peor en todos los sentidos para su caso de uso en particular. A menos que o hasta que te refieres a ejecutar en algunas de las antiguas/pequeño sistema que no puede páginas libres después de la terminación del proceso, o se puede integrar en un programa más amplio (YAGNI), se ve como una pérdida neta para mí. Me duele saber que un programador ego a pensar que de no hacerlo por sí mismo, pero ¿de qué manera práctica es realmente mejor?
    • una gran parte de mi experiencia es en un unhosted medio ambiente por lo que no hay un sistema operativo en el sentido normal de la palabra – hay un pequeño núcleo que proporciona algunas de mensajería y control de tareas, pero poco más en términos de servicios. Si no libera recursos que nunca se publicó. Considero que no libera los recursos que usted ha adquirido a la arrogancia. Suponiendo que alguien más va a hacerlo por ti no es un hábito que estoy dispuesto a adherir.
    • no hay mejor manera de averiguar que el código que se está corrompiendo el montón, a continuación, cancelar la asignación de la memoria. Dar la vuelta al ignorar poco en el montón de la corrupción no es prudente. No limpiar en la versión de Lanzamiento está bien, creo.
    • D. Shawley: Sin un sistema operativo, usted tiene que hacer un montón de cosas a mano. No suena como el poser de esta pregunta fue de tal situación, sin embargo.
    • nobugz: por último, un argumento plausible en favor de manual de desasignación! Si hay algo, sin embargo, me gustaría poner de en en las versiones de lanzamiento, desde ambientes desconocidos con datos desconocidos es donde quiero más información sobre lo que está pasando.
    • Aquellas personas que se propongan pérdidas de memoria en MODO debe ser despojado de toda la reputación e insignias
    • Estoy con Ken en este. En el peor de los casos, la desasignación puede ser extremadamente difícil problema de la sincronización entre hilos, y si no hay ninguna situación en la que la desasignación nunca iba a ocurrir, excepto la salida del programa, no vale la pena el costo de la escritura/mantenimiento y el riesgo de errores sólo para hacer algunos ideólogos feliz…
    • Tal vez sea yo, pero también me parece que hay lugares donde no se puede evitar, dependiendo OS de limpieza. Clave-ejemplo (*nix): la asignación dinámica de espacio para los argumentos que se pasan a execv()
    • Quieren otro argumento en favor de manual de desasignación? Aquí es un programa que quiero que se ejecute, por diez minutos, en el fondo, como el uso de su equipo como lo haría normalmente… Ahora sé que esto fugas de memoria mucho más rápido que la mayoría de sus programas, pero imagínese si cada programa hizo lo mismo que el tuyo… no su sistema de ser taaan bonito n estable? XD Diez minutos! Darle una oportunidad! No te olvides de en realidad el uso de tu ordenador durante este tiempo…
    • Hay una gran brecha entre su situación (es decir, la diferencia entre free(...) inmediatamente antes de su terminación y sin free(...), que es el objeto de la pregunta) y lo de Ken diciendo (que van más allá de la pregunta)… Para ser explícitos, Ken es desalentador todo manual de desasignación.
    • Además, su lógica es la descuidado cosas; «dime que nunca he visto un error en la desasignación de código!» y me dices que nunca he visto a ningún otro tipo de error en C! Por su lógica, deberíamos dejar de usar C…

  2. 43

    En general, moderno de propósito general de los sistemas operativos de hacer la limpieza después de terminados los procesos de. Esto es necesario porque la alternativa es que el sistema para perder recursos a lo largo del tiempo y requieren reiniciar debido a los programas que están mal escritos o, simplemente, que rara vez se producen errores que pérdida de recursos.

    Tener su programa explícitamente libre de sus recursos de todos modos puede ser una buena práctica por diversas razones, tales como:

    • Si usted tiene los recursos adicionales que se no limpiado por el sistema operativo en la salida, tales como archivos temporales o cualquier tipo de cambio para el estado de un recurso externo, entonces usted necesitará el código para lidiar con todas esas cosas en la salida, y esto es a menudo elegante combinado con la liberación de memoria.
    • Si el programa comienza a tener un largo tiempo de vida, entonces usted no tendrá la sólo manera de liberar memoria para salir. Por ejemplo, puede que desee convertir su programa en un servidor (demonio) que sigue funcionando, mientras que el manejo de muchas de las solicitudes de las unidades individuales de trabajo, o el programa podría convertirse en una pequeña parte de un programa más amplio.

    Sin embargo, aquí es una razón para ir a liberar memoria: eficiente apagado. Por ejemplo, supongamos que la aplicación contiene un gran caché en la memoria. Si cuando sale va a través de toda la memoria caché de la estructura y la libera de una sola pieza a la vez, que no sirve a ningún propósito útil y desperdicio de recursos. Especialmente, considere el caso donde las páginas de memoria que contiene la caché se han intercambiado a disco por el sistema operativo; por caminar a la estructura y a la liberación de lo que usted está llevar todas las páginas en la memoria de todos a la vez, perdiendo mucho tiempo y energía para ningún beneficio real, y, posiblemente, incluso causando otros programas en el sistema intercambia!

    Como un ejemplo, hay servidores de alto rendimiento que trabajar por la creación de un proceso para cada solicitud, y luego tener que salir cuando haya terminado; por esto significa que incluso no tienen que seguir la pista de la memoria asignación, y nunca está de liberar o recolección de la basura en todo, ya que todo se desvanece de nuevo en el sistema operativo de memoria libre en el final del proceso. (El mismo tipo de cosa que se puede hacer dentro de un proceso utilizando una costumbre asignador de memoria, pero requiere mucho cuidado de programación; esencialmente, haciendo de la propia noción de «procesos ligeros» en el sistema operativo del proceso.)

  3. 7

    Mis disculpas por la publicación de tan largo después de que el último post de este hilo.

    Un punto adicional. No todos los programas se hacen para agraciado salidas. Se bloquea y ctrl-C, etc. hará un programa para salir en incontrolada maneras. Si su sistema operativo no libre de la pila, limpie la pila, eliminar las variables estáticas, etc, finalmente cuelga el sistema de pérdidas de memoria o peor.

    Muy interesante, aparte de esto, se bloquea/rompe en Ubuntu, y me imagino que todos los demás sistemas operativos modernos, tienen problemas con la «manejado los recursos. Sockets, archivos, dispositivos, etc. puede permanecer en «abrir» cuando un programa termina o accidentes. También es una buena práctica para cerrar cualquier cosa con un «mango» o «descriptor» como parte de sus limpiar antes de la salida airosa.

    Actualmente estoy desarrollando un programa que se utiliza sockets fuertemente. Cuando me quedo atascado en un ala que tengo que hacer ctrl-c fuera de él, por lo tanto, varada mi sockets. He añadido un std::vector para recopilar una lista de todos los sockets y un sigaction controlador de capturas sigint y sigterm. El controlador se recorre la lista y se cierra el socket. He pensado en hacer una similar rutina de limpieza para el uso antes de que el tiro que va a conducir a la terminación prematura.

    Importarle a alguien para comentar en este diseño?

    • Me alegro de que dijo esto, porque yo tenía un programa que a la izquierda zócalo de recursos de todo, y nuestro sistema Ubuntu necesario reiniciar cada dos semanas o memoria de empezar a correr, y hay un montón de memoria. No estoy seguro de que los recursos del sistema son derribadas si usted se olvida de limpiar para arriba.
    • Stackoverflow no es un foro; no es nada mal con responder a una vieja pregunta. meta.stackexchange.com/questions/20524/reviving-old-questions
  4. 6

    Lo que está pasando aquí (en un sistema operativo moderno), es que su programa se ejecuta dentro de su propio «proceso». Este es un sistema operativo de la entidad que está dotado con su propio espacio de direcciones, descriptores de archivo, etc. Su malloc llamadas son la asignación de memoria del «montón», o no asignadas las páginas de memoria que se asigna a su proceso.

    Cuando el programa termina, como en este ejemplo, todos los recursos asignados para el proceso son simplemente reciclado/derribada por el sistema operativo. En el caso de la memoria, todas las páginas de memoria que se le asigna a usted simplemente está marcado como «libre» y reciclado para el uso de otros procesos. Las páginas tienen un menor nivel de concepto de lo que malloc asas; como resultado, los detalles de malloc/free son simplemente lavados como toda cosa de limpiarlo.

    Es el equivalente moral, cuando haya terminado de usar su computadora portátil y quieres darle a un amigo, que no se molestan en forma individual eliminar cada archivo. Usted acaba de formatear la unidad de disco duro.

    Dicho todo esto, como todos los demás ms responden están teniendo en cuenta, confiando en que esta no es una buena práctica:

    1. Siempre debe ser la programación de tomar el cuidado de los recursos, y en C que significa memoria de también. Usted podría terminar incrustar su código en una biblioteca, o que podría llegar a correr mucho más de lo esperado.
    2. Algunos OSs (los más antiguos y tal vez algunos modernos incrustado queridos) no puede mantener ese difícil proceso de fronteras, y sus asignaciones podría afectar a otros espacios de direcciones.
  5. 4

    Sí. El sistema operativo de la limpia de los recursos. Bueno … las versiones anteriores de NetWare no.

    Edit: Como San Jacinto, señaló, sin duda, hay sistemas (aparte de NetWare) que no lo hacen. Incluso en tirar programas, intento hacer un hábito de liberar todos los recursos para mantener el hábito.

    • Yo no soy downvoting, pero esta es una muy peligros post para la posteridad. DOS todavía se utiliza en muchas plataformas integradas, y tengo serias dudas de que se hace la limpieza de memoria para usted. El barrido de la generalización es incorrecta.
    • Jacinto: Que es un buen punto. Es por eso que me hizo tomar la NetWare de referencia, pero probablemente podría utilizar una aclaración. Voy a editar un poco.
    • DOS no es un multi-tasking OS – cuando un programa de ms-DOS (excluyendo Tsr) termina, toda la memoria disponible para el próximo programa a ser cargado.
    • gracias por el aviso, pero me refería a un TSR-como el programa que se pondría en marcha cuando se produce un evento, como es un uso común para sistemas embebidos. No obstante, muchas gracias por su experiencia y aclaraciones en las que no pude 🙂
  6. 2

    Sí, el sistema operativo libera toda la memoria cuando se termina el proceso.

    • No veo por qué esto fue votada abajo. malloc ed memoria se libera cuando el proceso se muere (la wikipedia la definición de las malloc lo dice)
    • Wikipedia no es el manual para cada sistema operativo en la existencia. Más moderno sistemas operativos va a recuperar la memoria, pero no todos (y especialmente no todos los antiguos) hacer. A esto se añade, malloc sólo puede prometer lo que C va a hacer con la memoria; por el diseño, la C no es garantía de nada de nada con respecto a la conducta fuera de la C sí mismo. Si la aplicación se muere inesperadamente, cualquier promesa de la biblioteca de tiempo de ejecución hechos son nulos, puesto que ya no está vivo para vivir de ellos.
  7. 2

    Depende, sistemas operativos generalmente limpiar y recoger para usted, pero si usted está trabajando en por ejemplo el software embebido entonces no podría ser puesto en libertad.

    Sólo asegúrese de que usted libre, puede ahorrar un montón de tiempo después cuando se desea integrar a un gran proyecto.

  8. 0

    Que realmente depende del sistema operativo, pero para todos los sistemas operativos que nunca voy a encontrar, la asignación de memoria desaparecerá cuando el proceso termina.

  9. 0

    Creo directa liberar es la mejor. Un comportamiento indefinido es lo peor, así que si usted tiene acceso, pero aún así se define en su proceso de hacerlo, hay un montón de buenas razones que dan las personas para ello.

    Dónde, o si, he encontrado que en W98, la pregunta real era ‘cuando’ (yo no vi un post enfatizando este). Una pequeña plantilla de programa (por MIDI SysEx de entrada, utilizando diversos malloc había espacios) sería la memoria libre en el WM_DESTROY poco de la WndProc, pero cuando he trasplantado esta a un programa más amplio que se estrelló en la salida. Supuse que eso significaba que yo estaba tratando de liberar lo que el OS ya había liberado durante una mayor limpieza. Si lo hice en el mensaje wm_close, a continuación, llama a DestroyWindow(), todo funcionaba bien, instantánea limpio salida.

    Si bien esto no es exactamente el mismo que el MIDI buffer, hay similitud en que lo mejor es mantener el proceso de la intacta, limpia completamente, entonces la salida. Con simples trozos de memoria, esto es muy rápido. He encontrado que muchos de los pequeños búferes trabajado más rápido en la operación y de limpieza de menos grandes.

    Excepciones que puedan existir, como alguien dijo al evitar el acarreo de grandes cantidades de memoria trozos de vuelta de un archivo de intercambio en el disco, pero incluso eso puede ser minimizado por mantener a más, y los más pequeños, los espacios asignados.

Dejar respuesta

Please enter your comment!
Please enter your name here