UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

6.12.3. Fugas de memoria en C

Plan de trabajo

  1. Resuelve los cuatro problemas que se plantean en el segundo documento. Asegúrate de que asistes a la sesión magistral con ellos bien entendidos.

Evaluación

En la siguiente clase se utilizarán estos conceptos para resolver un problema de gestión de memoria, por lo que necesitarás las soluciones para responder correctamente a las preguntas.

Autoevaluación automática

Comprueba con estas preguntas si has entendido este documento

Indique los errores que encuentra en cada trozo de código.

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int count_element(int id, struct list *inicio)
    {
      int cont=0;
      struct list *aux= (struct list *) malloc (sizeof(struct list));
      aux=inicio;
      while (aux!=NULL)
      {
       cont++;
       aux=aux->next;
      }
      return cont;
    }

    • No hay errores.

    • Línea 5: hay una fuga de memoria de 1 elemento de tamaño sizeof(struct list).

    • Línea 8: uso de memoria sin inicializar.

    • Línea 9: hay una fuga de memoria. Se pierde toda la lista.

  2. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int count_element(int id, struct list **inicio)
    {
      int cont=0;
      struct list *aux;
      aux=*inicio;
      while (*inicio!=NULL)
      {
       cont++;
       *inicio=(*inicio)->next;
      }
      return cont;
    }

    • No hay errores.

    • Línea 5: hay una fuga de memoria de 1 elemento de tamaño sizeof(struct list).

    • Línea 8: uso de memoria sin inicializar.

    • Línea 9: hay una fuga de memoria. Se pierde toda la lista.

  3. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int count_element(int id, struct list *inicio)
    {
      int cont;
      struct list *aux;
      aux=inicio;
      while (aux!=NULL)
      {
       cont++;
       aux=aux->next;
      }
      return cont;
    }

    • No hay errores.

    • Línea 5: hay una fuga de memoria de 1 elemento de tamaño sizeof(struct list).

    • Línea 8: uso de memoria sin inicializar.

    • Línea 9: hay una fuga de memoria. Se pierde toda la lista.

  4. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    struct list *del_element(int id, struct list *inicio)
    {
      struct list *aux,*ant;
      aux=inicio;
      ant=inicio;
      while ((aux!=NULL)&&(aux->id!=id))
      {
       ant=aux;
       aux=aux->next;
      }
      if (aux == NULL)
        return inicio;
      if (aux == ant)
      {
        free(aux);
        inicio=inicio->next;
      }
      else
      {
        ant->next=aux->next;
        free(aux);
      }
      return inicio;
    }

    • No hay errores

    • Línea 16: acceso a memoria con un puntero corrupto.

    • Línea 20: fuga de memoria.

    • Línea 13: memoria sin inicializar.

  5. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    struct list *del_element(int id, struct list *inicio)
    {
      struct list *aux,*ant;
      aux=inicio;
    
      while ((aux!=NULL)&&(aux->id!=id))
      {
       ant=aux;
       aux=aux->next;
      }
      if (aux == NULL)
        return inicio;
      if (aux == ant)
      {
        inicio=inicio->next;
        free(aux);
      }
      else
      {
        ant->next=aux->next;
        free(aux);
      }
      return inicio;
    }

    • No hay errores.

    • Línea 15: acceso a memoria con un puntero corrupto.

    • Línea 20: fuga de memoria.

    • Línea 13: memoria sin inicializar.

  6. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    struct list *del_element(int id, struct list *inicio)
    {
      struct list *aux,*ant;
      aux=inicio;
      ant=inicio;
      while ((aux!=NULL)&&(aux->id!=id))
      {
       ant=aux;
       aux=aux->next;
      }
      if (aux == NULL)
        return inicio;
      if (aux == ant)
      {
        inicio=inicio->next;
        free(aux);
      }
      else
      {
        ant->next=aux->next;
      }
      return inicio;
    }

    • No hay errores.

    • Línea 15: acceso a memoria con un puntero corrupto.

    • Línea 20: fuga de memoria.

    • Línea 13: memoria sin inicializar.

  7. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    struct  vector *create_vector(int number)
    {
    if (number == 0)
      return NULL;
    struct vector *nuevo= (struct vector *) malloc(sizeof(struct vector)*number);
    if (nuevo == NULL)
      return NULL;
    int i=0;
    while (i<=number)
    {
      nuevo[i]=i;
      i++;
    }
    return nuevo;
    }

    • No hay errores.

    • Línea 9: memoria sin inicializar.

    • Línea 11: sobre-escritura de memoria dinámica.

  8. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    struct  vector *create_vector(int number)
    {
    if (number == 0)
      return NULL;
    struct vector *nuevo= (struct vector *) malloc(sizeof(struct vector)*number);
    if (nuevo == NULL)
      return NULL;
    int i;
    while (i<number)
    {
      nuevo[i]=i;
      i++;
    }
    return nuevo;
    }

    • No hay errores.

    • Línea 9: memoria sin inicializar.

    • Línea 11: sobre-escritura de memoria dinámica.