Existen dos formas de definir una pérdida de memoria.
En primer lugar, si los datos no se liberan cuando ya no hay referencias, no se puede acceder a esos datos (a menos que tenga algún puntero dañado o lea los datos en un búfer o algo así). Básicamente, si no libera/elimina los datos asignados en el montón, se vuelve inutilizable y simplemente desperdicia memoria.
Puede haber casos en los que se pierde un puntero pero los datos aún están accesibles. Por ejemplo, si almacena el puntero en un int, o almacena un desplazamiento en el puntero (usando la aritmética del puntero), aún puede recuperar el puntero original.
En esta primera definición, los datos son manejados por recolectores de basura, que realizan un seguimiento del número de referencias a los datos.
En segundo lugar, la memoria se pierde esencialmente si no se libera/elimina la última vez que se usó. Se puede referenciar, e inmediatamente libre, pero se ha cometido el error de no hacerlo. Puede haber una razón válida (por ejemplo, en el caso en que un destructor tiene algún extraño efecto secundario), pero eso indica un mal diseño del programa (en mi opinión).
Este segundo tipo de pérdida de memoria a menudo ocurre cuando se escriben pequeños programas que usan archivos IO. Abre el archivo, escribe sus datos, pero no lo cierra una vez que haya terminado. El ARCHIVO * aún puede estar dentro del alcance y fácilmente cerrable. Nuevamente, puede haber alguna razón para hacer esto (como bloquear el acceso de escritura por otros programas), pero para mí eso es una bandera de mal diseño.
En esta segunda definición, los recolectores de basura no manejan los datos, a menos que el compilador/intérprete sea inteligente (o tonto) lo suficiente como para saber que ya no se usará más, y esto liberará los datos. efectos secundarios.
I belive La respuesta de Brian Gianforcaro es la mejor y más sucinta. – Foredecker
¿Por qué no aceptas la definición de Wikipedia? –
@Joshua Swink: Porque eso sería un policía sin respuesta. :) – Spoike