Los peligros de devolver punteros

 

Cuando escoges un lenguaje que deja en tus manos la gestión de memoria tienes que tener mucho cuidado con la manera en que gestionas los recursos que están a tu disposición. Si bien es cierto que puedes tener mucha flexibilidad a la hora de manejar la forma en que pasas los datos a tus funciones o métodos, esa flexibilidad se convierte en responsabilidad a la hora de liberar de forma correcta lo que en algún momento reclamas.
Por norma, siempre es buena idea que algún punto de nuestro programa se haga responsable de la memoria que el mismo pide, de esta manera sabrá como y cuando liberarlo. Por ejemplo, si una función necesita pasar un espacio de memoria a otra función para que escriba en ella, la mejor idea es que la función cree el espacio y se lo pase a la función de lectura ya creado, de tal maneras que cuando lo use, sea capaz de eliminarlo sin problemas.
void f1()
{
  ...
  char* buffer = new char[100];
  f2(buffer);
  ...
  delete [] buffer;
  ...
}
Uno de los diseños que pueden inducir a problemas es el hecho de que una función devuelva un puntero a una memoria de la que dicha función pierde la responsabilidad. Por ejemplo
char* f2()
{
  char* buffer = new char[100];
  ...
  return buffer;
}
Este diseño, puede ocasionar que la memoria de buffer nunca sea liberada, por ejemplo, si usamos la llamada como parametro de otra función, esa memoria nunca se liberará, o bien por que directamente se nos olvide liberar la memoria que no hemos reservado en la función original, por ejemplo:
void f1()
{
  int len = strlen(f2()); // la memoria de f2 no es accesible
}
En este ejemplo vemos como la memoria que f2() ha reservado, nunca se libera, pues no hay ninguna variable que la referencie y que podamos usar para liberarla.

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: