Есть утечка памяти; как освободить это малло c? - PullRequest
0 голосов
/ 17 апреля 2020
bool check(const char *word)
{
    int length = strlen(word);

    //malloc size of char times length of word plus \0
    char *lower_case = malloc(sizeof(char) * (length + 1));
    lower_case[length + 1] = '\0';

    //change characters to lowercase
    for (int i = 0; i < length; i++)
    {
        lower_case[i] = tolower(word[i]);
    }

    //generate int hash
    int index = generate_hash(lower_case);

    node_ptr trav = hashtable[index];

    while (trav != NULL)
    {
        if (strcmp(trav->word, lower_case) == 0)
        {
            return true;
        }
        trav = trav -> next;
    }
    free(lower_case);

    return false;
}

Я получил 27 байт памяти из теста Valgrind; как это бесплатно?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020
  • lower_case[length + 1] = '\0'; пишет вне границ, меняется на [length].
  • Вам не хватает #include <stdlib.h> и других необходимых включений.
  • Вы создаете утечку памяти каждый раз вы выполняете return true;.
  • Никогда не скрывайте указатели за typedef, как преподают такие классы дерьма, как CS-50.

Вы должны быть в состоянии исправить код по строкам этого :

#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>

bool check (const char *word) 
{ 
  size_t length = strlen(word);

  char* lower_case = malloc(length + 1);
  if(lower_case == NULL)
  {
    return false;
  }

  //change characters to lowercase
  for (size_t i = 0; i < length; i++)
  {
    lower_case[i] = tolower(word[i]);
  }
  lower_case[length] = '\0'; 

  //generate int hash
  int index = generate_hash(lower_case); 
  bool result = false;
  for(const node* trav = hashtable[index]; trav!=NULL; trav=trav->next)
  {
    if (strcmp(trav->word, lower_case) == 0)
    {
        result = true;
        break;
    }
  }

  free(lower_case);
  return result;
}

Тип node_ptr необходимо изменить на node без скрытых указателей.

0 голосов
/ 17 апреля 2020

Сразу после malloc есть выход за пределы.

Здесь вы получаете доступ за пределами:

lower_case[length + 1] = '\0';

Это должно быть:

lower_case[length] = '\0';

Также целесообразно проверить, не удалось ли malloc Тоже!

Как отмечалось в комментариях, есть также случай, когда может произойти утечка памяти при возврате изнутри l oop. Вам нужно освободить там:

  if (strcmp(trav->word, lower_case) == 0)
    {
        free(lower_case);
        return true;
    }
...