Ir al contenido

Diferencia entre revisiones de «Fuga de memoria»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
ColdWind (discusión · contribs.)
entradilla
Wikante (discusión · contribs.)
Añadida técnica de "Adquirir Recursos es Inicializar" (RAII)
Línea 8: Línea 8:


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

== RAII ==
{{main|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 [[Programación_orientada_a_objetos|lenguajes de programación orientados a objetos]] como [[C++]], y [[Ada_(lenguaje_de_programación)|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 [[Recolector_de_basura|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++:

<source lang="c">
/* Versión en C */
#include <stdlib.h>

void f(int n)
{
int* array = calloc(n, sizeof(int));
realizar_otras_operaciones();
free(array);
}
</source>

<source lang="cpp">
// Versión en C++.
#include <vector>

void f(int n)
{
std::vector<int> array (n);
realizar_otras_operaciones();
}
</source>

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 [[Recolector_de_basura|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)


==Véase también==
==Véase también==

Revisión del 15:51 15 abr 2010

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 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

"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)

Véase también