【问题标题】:How to fix memory leak when calloccalloc时如何修复内存泄漏
【发布时间】:2019-05-25 17:28:19
【问题描述】:

我的程序正在读取一个文件(test.txt,它只包含 2 个字符串和一个空格,例如:“Hello World”),当我使用 calloc 时,使用 valgrind 会导致内存泄漏。问题是我在第二次内存分配中丢失了更多字节(b = calloc(11,sizeof(*b))。

我试过用free()没用

    char str[1024];
    char *a = NULL;
    char *a = NULL;
    int i = 0;
    while(!feof(myfile)) {
       //I used some codes here to skip "\r\n" which is working fine.
       fscanf(myfile, "%10s", str);
       i = strlen(str);
       if(key_find(k,str) == NULL){
         a = calloc(i,sizeof(*a));
         strcpy(a,str);
         key_insert(k,a);
       }
       fscanf(myfile, " ");
       fscanf(myfile, "%10s", str);
       if(key_find(k,str) == NULL){
         b = calloc(i,sizeof(*a));
         strcpy(b,str);
         key_insert(k,a);
       }
    }
   free(a); free(b);

当我的 txt 文件中只有 2 个不同的字符串时,它不会给我任何内存泄漏。但是如果我有超过 4 个字符串,那么它会给我带来内存泄漏。

【问题讨论】:

  • 让 free() 工作。
  • ` i = strlen(str); a = calloc(i,sizeof(*a)); strcpy(a,str);` - 你需要为终止零字符分配内存。 calloc(i + 1, ...).
  • 您在循环内调用calloc,但在循环外调用free。因此,您调用free 的次数似乎与调用calloc 的次数不同。
  • 是的,但是当我这样做时,它给我的错误是找不到密钥。

标签: c valgrind dynamic-memory-allocation


【解决方案1】:

在运行时,您需要执行与 callocs 一样多的免费操作。如果 calloc 在循环内,free 也应该在循环内,例如:

 a = calloc(i,sizeof(*a));
 strcpy(a,str);
 key_insert(k,a);
 free(a); /* you need to free a when it is not needed */

然后

 b = calloc(i,sizeof(*a));
 strcpy(b,str);
 key_insert(k,a); /* you should probably replace this by key_insert(k,b) */
 free(b); /* don't need b anymore? free it! */

【讨论】:

  • 在一段时间内?我试过了,但它给了我错误“找不到密钥”尽管我插入了
  • 您说得对,每个calloc() 最终都需要一个free(),这可能会发生在a 循环中。但是,如果key_insert() 不复制a 参数,则释放应该只在key_insert() 管理的数据结构被释放时进行,而不是在输入循环中。应该调用free() 的确切时间取决于问题中未透露的细节。
  • @JonathanLeffler 是的!我在函数 key_insert 中使用了 strcpy,现在它可以工作了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2012-01-12
  • 2018-05-09
  • 2018-07-12
  • 2012-09-14
  • 2020-05-24
  • 2011-05-25
相关资源
最近更新 更多