当前位置: 首页 > 知识库问答 >
问题:

出现内存泄漏;如何释放这个malloc?

令狐声
2023-03-14
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 字节的内存;如何释放它?

共有2个答案

宋伟泽
2023-03-14
匿名用户

malloc之后立即有越界访问。

在这里,您正在越界访问:

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

应该是:

lower_case[length] = '\0';

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

正如注释中提到的,当从循环内部返回时,也有可能发生内存泄漏。你需要解放那里:

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

薛欣德
2023-03-14
  • lower_case[长度1]='\0';写出界,改成[长度].
  • 您缺少#include

您应该能够按照如下方式修复代码:

#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更改为没有隐藏指针的节点

 类似资料:
  • 问题内容: 所以我有这个C ++程序,它是通过Java程序中的JNI调用的,代码如下: 在倒数第二行中,从不释放而是返回,是否会导致最终的内存泄漏?反正有解决这个问题的方法吗? 还有可能不是返回字符串而是返回布尔值(由LogonUser函数返回),而不是jstring,而是添加了要在方法中传递的“ errormessage”引用,并更新了它?我的Java程序能否看到“ errormessage”的

  • 问题内容: 我正在运行django应用程序,其中包括matplotlib,并允许用户指定图形的轴。这可能会导致 “溢出错误:超出了Agg复杂度” 发生这种情况时,最多会占用100MB的RAM。通常,我会使用,和释放该内存,但是与该错误关联的内存似乎与该绘图对象无关。 有谁知道我该如何释放记忆? 谢谢。 这是一些给我Agg复杂度错误的代码。 问题答案: 我假设您可以至少运行一次您发布的代码。该问题仅

  • 我已经在我的机器(ubuntu)中安装了Clang,以便在我的C代码中查找内存泄漏。我写了一个示例代码来检查它的工作情况,如下所示: 我在互联网上找到了一些编译选项 和 但它们都没有出现内存泄漏的迹象。 扫描构建:使用“/usr/bin/clang”进行静态分析 扫描构建:删除目录“/tmp/scan-build-2015-07-02-122717-16928-1”,因为它不包含报告 扫描构建:未

  • 在阅读了大量有关MAT的内容后,我使用我的生产堆转储来分析内存泄漏问题。下面是泄漏报告错误: 线程org.apache.tomcat.util.threads.taskthread@0x6d8be0a30 http-bio-8443-exec-115保留总大小为3,695,816,440(89.03%)字节的局部变量。 内存累积在“'<'System class Loader'>”加载的“java

  • 一、内存溢出 一种程序运行出现的错误。 当程序运行需要的内存超过了剩余的内存时, 就出抛出内存溢出的错误。 二、内存泄漏 占用的内存没有及时释放。 内存泄露积累多了就容易导致内存溢出。 常见的内存泄露: 意外的全局变量。 没有及时清理的计时器或回调函数。 闭包 // 1. 内存溢出 var obj = {} for (var i = 0; i < 10000; i++) { obj[i] =

  • 问题内容: 我在Java中的总的初学者和已经创建了一个简单的Java的Android片断其中一个Runnable 1,5秒钟后,我改变从到。它工作正常,基本上应该防止这种内存泄漏发生吗?我怀疑在发生设备定向时是否绝对没有内存泄漏。我很乐意对此进行检查,但无法在模拟的Android中更改方向。 这是代码: 编辑 它可以防止内存泄漏,但也有一些答案与UI线程阻塞有关。实际上,此代码在主(UI)线程中运

  • 问题内容: 我认为我的android应用正在泄漏内存。我不是绝对确定这是问题所在。 应用程序打开时经常崩溃,并且logcat尝试加载位图图像时会显示“内存不足”异常。 崩溃后,我重新打开了该应用程序,它运行正常。Logcat会显示许多“ gc”,并且JIT表会不时地向上调整大小,而不会向下调整,直到应用程序因内存不足错误而崩溃。 这听起来像是内存泄漏吗?如果是这样,我该如何定位和关闭泄漏点。 这是

  • 问题内容: 我一直在追寻内存泄漏(由“ valgrind –leak-check = yes”报告),它似乎来自ALSA。这段代码已经存在于自由世界中一段时间​​了,所以我猜这是我做错的事情。 输出看起来像这样: 并继续一些页面 这是由于我在一个项目中使用ALSA并开始看到这种巨大的泄漏……或者至少是所说泄漏的报告。 所以问题是:是我,ALSA或valgrind在这里遇到问题吗? 问题答案: ht