UC3M

Telematic/Audiovisual Syst./Communication Syst. Engineering

Systems Architecture

September 2017 - January 2018

6.12.3.  Memory Leaks in C

Work Plan

  1. Solve the four problems included in the second document. Make sure you attend the master session with them fully understood.

Assessment

In the following session you will use these concepts to solve a memory management problem, thus you may use these solutions to answer correctly the questions.

Automatic self-assessment

Check with these questions if you understood this document

Choose the errors found in each piece of code.

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

    • Line 5: There is a memory leak of size sizeof(struct list).

    • Line 8: Uninitialized memory.

    • Line 9: there is a memory leak. The whole list is lost.

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

    • Line 5: There is a memory leak of size sizeof(struct list).

    • Line 8: Uninitialized memory.

    • Line 9: there is a memory leak. The whole list is lost.

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

    • Line 5: There is a memory leak of size sizeof(struct list).

    • Line 8: Uninitialized memory.

    • Line 9: there is a memory leak. The whole list is lost.

  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 errors

    • Line 16: Accessing memory with a corrupt pointer.

    • Line 20: memory leak.

    • Line 13: Uninitialized memory.

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

    • Line 15: Accessing memory with a corrupt pointer.

    • Line 20: memory leak.

    • Line 13: Uninitialized memory.

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

    • Line 15: Accessing memory with a corrupt pointer.

    • Line 20: memory leak.

    • Line 13: Uninitialized memory.

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

    • Line 9: Uninitialized memory.

    • Line 11: Overwriting dynamic memory.

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

    • Line 9: Uninitialized memory.

    • Line 11: Overwriting dynamic memory.