2010-01-07 5 views

Respuesta

46

Es posible, sí.

Depende del tipo de pérdida de memoria de la que está hablando. Dentro del código python puro, no es posible "olvidar liberar" la memoria como en C, pero es posible dejar una referencia colgada en algún lugar. Algunos ejemplos de tales:

  • un objeto de rastreo no controlada que está manteniendo un marco de pila entera viva, a pesar de que la función ya no se está ejecutando

  • almacenar valores en un ámbito de clase o global en lugar de instancia alcance y sin darse cuenta.

  • Referencias cíclicas en las clases que también tienen un método __del__. Irónicamente, la existencia de un __del__ hace imposible que el recolector de basura cíclico limpie una instancia.

  • extensiones C mal implementadas o que no usan correctamente las bibliotecas C como se supone que deben ser.

  • Scopes que contienen cierres que contienen un conjunto mucho más de lo que podría haber esperado

  • parámetros predeterminados que son tipos mutables:

.

def foo(a=[]): 
    a.append(time.time()) 
    return a 

Y mucho más .....

+3

Buena mención de los parámetros predeterminados mutables. Son peligrosos porque la forma en que trabajan no es realmente intuitiva, pero también porque pueden crecer mucho si no se cuida ... +1 –

+0

+1 por mencionar esa implementación del método foo. ¡Nunca lo supe! –

+0

¿Podría elaborar o proporcionar alguna documentación en su primera viñeta "un objeto de rastreo no controlado que mantiene vivo un marco de pila completo, aunque la función ya no se esté ejecutando"? De hecho, tengo una fuga de rastreo pero no veo por qué se hace referencia en ningún lugar (https://stackoverflow.com/questions/44681681/what-could-prevent-a-traceback-from-being-garbage-collected) – BiAiB

6

Por supuesto que puede. El ejemplo típico de una pérdida de memoria es si construye un caché que nunca enjuaga manualmente y que no tiene una política de desalojo automático.

+3

Técnicamente, eso no es una pérdida de memoria ya que la aplicación aún ** puede ** liberar la memoria, aunque opta por no hacerlo. – Justin

+2

Bueno, creo que definimos la "fuga de memoria" de manera diferente, entonces. Para mí, una fuga es una fuga, independientemente de si es posible repararla o no. –

+0

Si no tiene código para eliminar elementos de la memoria caché, entonces no puede eliminarlos, ¿o sí? –

1

En el sentido de huérfanos asignados objetos después de que salgan de alcance porque se olvidó de desasignarlos, no; Python desasignará automáticamente objetos fuera del alcance (Garbage Collection). Pero en el sentido de que @Antione está hablando, sí.

7

La definición clásica de una pérdida de memoria es la memoria que se utiliza una vez, y ahora no lo es, pero no se ha recuperado. Eso es casi imposible con el código puro de Python. Pero como señala Antoine, puede tener el efecto de consumir toda su memoria inadvertidamente al permitir que las estructuras de datos crezcan sin límites, incluso si no necesita mantener todos los datos.

Con extensiones C, por supuesto, está de vuelta en territorio no gestionado, y todo es posible.

Cuestiones relacionadas