Fuga de memoria

Fuga de memoria

Una fuga de memoria (más conocido por el término inglés memory leak) es un error de software que ocurre cuando un bloque de memoria reservada no es liberada en un programa de computación. Comúnmente ocurre porque se pierden todas las referencias a esa área de memoria antes de haberse liberado.

Dependiendo de la cantidad de memoria perdida y el tiempo que el programa siga en ejecución, este problema puede llevar al agotamiento de la memoria disponible en la computadora.

Este problema se da principalmente en aquellos lenguajes de programación en los que el manejo de memoria es manual (C o C++ principalmente), y por lo tanto es el programador el que debe saber en qué momento exacto puede liberar la memoria. Otros lenguajes utilizan un recolector de basura o conteo de referencias que automáticamente efectúa esta liberación. Sin embargo todavía es posible la existencia de fugas en estos lenguajes si el programa acumula referencias a objetos, impidiendo así que el recolector llegue a considerarlos en desuso.

Existen varias formas de luchar contra este problema. Una forma es el uso de un recolector de basura incluso en el caso en el que éste no sea parte estándar del lenguaje. El más conocido recolector de basura usado de esta manera es el Boehm-Demers-Weiser conservative garbage collector. Otras técnicas utilizadas son la adopción de esquemas de conteo de referencias o el uso de pools de memoria (técnica menos popular, utilizada en el servidor Apache y en el sistema de versiones Subversion).

También hay herramientas para "auscultar" un programa y detectar las fugas. Una de las herramientas más conocidas es Valgrind.

RAII

Artículo principal: Adquirir Recursos es Inicializar

"Adquirir Recursos es Inicializar", a menudo referido por sus siglas en inglés RAII (de "Resource Acquisition Is Initialization"), es un popular patrón de diseño en varios lenguajes de programación orientados a objetos como C++, y Ada. RAII soluciona las fugas de memoria relacionando objetos con los recursos adquiridos, y automáticamente liberando los recursos cuando los objetos terminan su vida. A diferencia de la recolección de basura, RAII tiene las ventajas de: saber cuándo los objetos existen y saber cuándo no. Se puede comparar los siguientes ejemplos en C y C++:

/* Versión en C */
#include <stdlib.h>
 
void f(int n)
{
  int* array = calloc(n, sizeof(int));
  realizar_otras_operaciones();
  free(array);
}
// Versión en C++.
#include <vector>
 
void f(int n)
{
  std::vector<int> array (n);
  realizar_otras_operaciones();
}

La versión en C requiere que el desarrollador haga la liberación de memoria, a diferencia de la versión en C++. Esto evita la sobrecarga de los esquemas de la recolección de basura, e incluso puede ser aplicado a otros recursos como:

  • "Handles" a archivos, que la recolección de basura "mark-and-sweep" no maneja tan efectivamente
  • Ventanas que han de ser cerradas
  • Iconos en el área de notificación que han de ser ocultados
  • Código de sincronización como monitores, secciones críticas, etc. que deben ser liberados para permitir que otros hilos de ejecución("threads") los obtengan
  • "Handles" al registro de Windows que están abiertos
  • Conexiones de red
  • Objetos GDI de Windows
  • Acciones a realizar cuando se termina una función (o bloque de código) en cualquier punto posible (la acción la realiza el destructor de un objeto creado cuando empieza la función)

Fugas de memoria en lenguajes con recolector de basura

Las fugas de memoria en lenguajes como JavaScript o C# también son comunes, por ejemplo pueden ocurrir cuando hay referencias circulares entre los objetos. Por ejemplo un objeto ventana tiene una referencia a cada uno de sus controles (botones, imágenes, etc), a su vez cada control tiene una referencia a la ventana que lo contiene. Los recolectores de memoria que usan conteo de referencias pueden no darse cuenta que una ventana ya no es usada porque sigue habiendo referencia a ella (de sus controles).

Estas fugas de memoria son muy comunes cuando se programa en forma despreocupada. Hay técnicas para evitarlas (por ejemplo eliminar alguna de las referencias para cortar el círculo).

En JavaScript ocurren también referencias circulares cuando se escriben funciones dentro de otras, porque cuando una función es escrita dentro de otra se mantiene una referencia a la que la incluye (para poder usar sus variables). El concepto de clausura explica estos comprtamiento. En C# también se pueden dar referencias circulares por el uso de clausuras cuando se escriben funciones delegadas anónimas.

Véase también


Wikimedia foundation. 2010.

Игры ⚽ Поможем решить контрольную работу

Mira otros diccionarios:

  • Fuga de memoria (informática) — Error de software que ocurre cuando un bloque de memoria reservada no es liberada en un programa de computación. Comúnmente ocurre porque se pierden todas las referencias a esa área de memoria antes de haberse liberado. Ojo Dependiendo de la… …   Enciclopedia Universal

  • Memoria (informática) — En informática, la memoria (también llamada almacenamiento) se refiere a parte de los componentes que forman parte de una computadora. Son dispositivos que retienen datos informáticos durante algún intervalo de tiempo. Las memorias de computadora …   Wikipedia Español

  • Asociación para la Recuperación de la Memoria Histórica — Acrónimo ARMH Tipo Asociación sin ánimo de lucro Fundación diciembre de 2000 Fundador(es) …   Wikipedia Español

  • Lenguaje de programación Java — Saltar a navegación, búsqueda Java Paradigma: Orientado a objetos Apareció en: 1991 Diseñado por: Sun Microsystems Tipo de dato: Fuerte, Estático Implementacion …   Wikipedia Español

  • Puntero inteligente — En programación, un puntero inteligente (o smart pointer) es un tipo abstracto de datos que simula el comportamiento de un Puntero (informática) pero añadiendo nuevas características adicionales, como recolector de basura automático y comprobador …   Wikipedia Español

  • Vector (informática) — Para otros usos de este término, véase Matriz. Matriz unidimensional con 10 elementos. En programación, una matriz o vector (llamados en inglés arrays) es una zona de almacenamiento continuo, que contiene una serie de elementos del mismo tipo,… …   Wikipedia Español

  • Conteo de referencias — Conteo de referencias, en inglés Reference counting, es una técnica para contabilizar las veces que un determinado recurso está siendo referido. Por lo general ese recurso son bloques de memoria y la técnica permite establecer cuando no existe… …   Wikipedia Español

  • Herramienta de programación — Una herramienta de programación es un programa informático que usa un programador para crear, depurar, gestionar o mantener un programa. Tipos Existen diversos tipos de herramientas con fines muy diversos, a continuación se listan algunas seguida …   Wikipedia Español

  • Adblock Plus — ABP en la lista de complementos …   Wikipedia Español

  • Sistema de seguimiento de errores — Un sistema de seguimiento de errores es una aplicación informática diseñada para ayudar a asegurar la calidad de software y asistir a los programadores y otras personas involucradas en el desarrollo y uso de sistemas informáticos en el… …   Wikipedia Español

Compartir el artículo y extractos

Link directo
Do a right-click on the link above
and select “Copy Link”