发生内存泄漏;如何释放这个 malloc?

Got memory leak; how to free this malloc?

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

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

    //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 个字节的内存;如何释放它?

malloc 之后立即出现越界访问。

此处,您正在越界访问:

lower_case[length + 1] = '[=10=]';

应该是:

lower_case[length] = '[=11=]';

检查 malloc 是否也失败了也是一个明智的想法!

如评论中所述,还有一种情况是从循环内部返回时会发生内存泄漏。你需要在那里释放:

  if (strcmp(trav->word, lower_case) == 0)
    {
        free(lower_case);
        return true;
    }
  • lower_case[length + 1] = '[=11=]';写越界,改成[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] = '[=10=]'; 

  //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没有隐藏指针。