[Memory-Leaks] La mejor definición de fuga de memoria



Answers

Memoria asignada que no se puede usar porque se ha perdido la referencia a la misma.

Question

Siento que los desarrolladores hablan de fugas de memoria, pero cuando les preguntas qué significa eso, muchos no tienen idea. Para evitar estas situaciones, decidamos una.

Por favor, no hay definiciones de Wikipedia ...

¿Cuál es su mejor definición de fuga de memoria y cuál es la mejor manera de prevenirla?




Todas las definiciones dadas aquí (en el momento en que escribí esto, hemos obtenido mejores respuestas desde entonces) no solucionan un caso límite:

Usted tiene un singleton que asigna memoria al momento de la creación y esta memoria normalmente se mantiene mientras el programa se está ejecutando aunque el uso actual esté hecho y no se sabe si se realizará o no un uso futuro. Esto generalmente se hace debido a la sobrecarga de recrearlo.

Con el estándar "no se puede liberar cuando se termine con esto", esto se consideraría una fuga y he visto que las herramientas de informe de fugas llaman tales cosas a pérdidas ya que la memoria todavía estaba en uso. (Y, de hecho, el código puede no contener código capaz de limpiar el objeto).

Sin embargo, me he encontrado con un código de esta naturaleza en las bibliotecas de compiladores antes incluso cuando el costo de volver a crear el objeto no es tan bueno.

¿Fuga o no?




Definición : falla al liberar memoria después de la asignación

Mozilla tiene una excelente página de herramientas para rastrear fugas de memoria.




Pérdida de memoria : no se puede liberar memoria que ya no necesita antes:

  • El programa termina
  • Se asigna memoria adicional

La mejor manera de evitar fugas de memoria: liberar memoria tan pronto como ya no sea necesaria.




Estas son algunas técnicas para prevenir / detectar fugas de memoria:

  1. Considere su algoritmo en términos de consumo de memoria. Otros encuestados han mencionado el hecho de que no tiene que perder el puntero a un elemento asignado para perder memoria. Incluso si su implementación contiene errores de puntero cero, de todos modos puede perder memoria de manera efectiva si mantiene los elementos asignados mucho después de que realmente los necesite.

  2. Perfile su aplicación. Puede usar herramientas de depuración de memoria como Valgrind o Purify para buscar fugas.

  3. Prueba de caja negra. Observe qué le sucede a su código compilado después de alimentarlo con grandes conjuntos de datos, o permita que se ejecute durante largos períodos de tiempo. Vea si su huella de memoria tiene una tendencia a crecer sin límite.




Links