内存泄漏;如何释放此malloc?

时间:2020-04-17 11:39:22

标签: c malloc valgrind cs50

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

我从Valgrind测试中泄漏了27个字节的内存;如何释放它?

2 个答案:

答案 0 :(得分:1)

  • lower_case[length + 1] = '\0';写越界,更改为[length]
  • 您遗漏了#include <stdlib.h>和其他必要内容。
  • 每次执行return true;时都会造成内存泄漏。
  • 如CS-50之类的废话类所讲,永远不要将指针隐藏在typedef后面。

您应该能够按照以下步骤修正代码:

#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,而无需隐藏指针。

答案 1 :(得分:0)

malloc之后,有一个越界访问。

在这里,您正在访问范围之外

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

应该是:

lower_case[length] = '\0';

检查malloc是否也失败也是明智的选择!

如注释中所述,从循环内部返回时,还可能发生内存泄漏。您需要在那里释放

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